tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

googletest-port-test.cc (39736B)


      1 // Copyright 2008, Google Inc.
      2 // All rights reserved.
      3 //
      4 // Redistribution and use in source and binary forms, with or without
      5 // modification, are permitted provided that the following conditions are
      6 // met:
      7 //
      8 //     * Redistributions of source code must retain the above copyright
      9 // notice, this list of conditions and the following disclaimer.
     10 //     * Redistributions in binary form must reproduce the above
     11 // copyright notice, this list of conditions and the following disclaimer
     12 // in the documentation and/or other materials provided with the
     13 // distribution.
     14 //     * Neither the name of Google Inc. nor the names of its
     15 // contributors may be used to endorse or promote products derived from
     16 // this software without specific prior written permission.
     17 //
     18 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     19 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     20 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     21 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     22 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     23 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     24 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     25 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     26 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     27 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     28 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     29 //
     30 // This file tests the internal cross-platform support utilities.
     31 #include <stdio.h>
     32 
     33 #include "gtest/internal/gtest-port.h"
     34 
     35 #if GTEST_OS_MAC
     36 # include <time.h>
     37 #endif  // GTEST_OS_MAC
     38 
     39 #include <list>
     40 #include <memory>
     41 #include <utility>  // For std::pair and std::make_pair.
     42 #include <vector>
     43 
     44 #include "gtest/gtest.h"
     45 #include "gtest/gtest-spi.h"
     46 #include "src/gtest-internal-inl.h"
     47 
     48 using std::make_pair;
     49 using std::pair;
     50 
     51 namespace testing {
     52 namespace internal {
     53 
     54 TEST(IsXDigitTest, WorksForNarrowAscii) {
     55  EXPECT_TRUE(IsXDigit('0'));
     56  EXPECT_TRUE(IsXDigit('9'));
     57  EXPECT_TRUE(IsXDigit('A'));
     58  EXPECT_TRUE(IsXDigit('F'));
     59  EXPECT_TRUE(IsXDigit('a'));
     60  EXPECT_TRUE(IsXDigit('f'));
     61 
     62  EXPECT_FALSE(IsXDigit('-'));
     63  EXPECT_FALSE(IsXDigit('g'));
     64  EXPECT_FALSE(IsXDigit('G'));
     65 }
     66 
     67 TEST(IsXDigitTest, ReturnsFalseForNarrowNonAscii) {
     68  EXPECT_FALSE(IsXDigit(static_cast<char>('\x80')));
     69  EXPECT_FALSE(IsXDigit(static_cast<char>('0' | '\x80')));
     70 }
     71 
     72 TEST(IsXDigitTest, WorksForWideAscii) {
     73  EXPECT_TRUE(IsXDigit(L'0'));
     74  EXPECT_TRUE(IsXDigit(L'9'));
     75  EXPECT_TRUE(IsXDigit(L'A'));
     76  EXPECT_TRUE(IsXDigit(L'F'));
     77  EXPECT_TRUE(IsXDigit(L'a'));
     78  EXPECT_TRUE(IsXDigit(L'f'));
     79 
     80  EXPECT_FALSE(IsXDigit(L'-'));
     81  EXPECT_FALSE(IsXDigit(L'g'));
     82  EXPECT_FALSE(IsXDigit(L'G'));
     83 }
     84 
     85 TEST(IsXDigitTest, ReturnsFalseForWideNonAscii) {
     86  EXPECT_FALSE(IsXDigit(static_cast<wchar_t>(0x80)));
     87  EXPECT_FALSE(IsXDigit(static_cast<wchar_t>(L'0' | 0x80)));
     88  EXPECT_FALSE(IsXDigit(static_cast<wchar_t>(L'0' | 0x100)));
     89 }
     90 
     91 class Base {
     92 public:
     93  Base() : member_(0) {}
     94  explicit Base(int n) : member_(n) {}
     95  Base(const Base&) = default;
     96  Base& operator=(const Base&) = default;
     97  virtual ~Base() {}
     98  int member() { return member_; }
     99 
    100 private:
    101  int member_;
    102 };
    103 
    104 class Derived : public Base {
    105 public:
    106  explicit Derived(int n) : Base(n) {}
    107 };
    108 
    109 TEST(ImplicitCastTest, ConvertsPointers) {
    110  Derived derived(0);
    111  EXPECT_TRUE(&derived == ::testing::internal::ImplicitCast_<Base*>(&derived));
    112 }
    113 
    114 TEST(ImplicitCastTest, CanUseInheritance) {
    115  Derived derived(1);
    116  Base base = ::testing::internal::ImplicitCast_<Base>(derived);
    117  EXPECT_EQ(derived.member(), base.member());
    118 }
    119 
    120 class Castable {
    121 public:
    122  explicit Castable(bool* converted) : converted_(converted) {}
    123  operator Base() {
    124    *converted_ = true;
    125    return Base();
    126  }
    127 
    128 private:
    129  bool* converted_;
    130 };
    131 
    132 TEST(ImplicitCastTest, CanUseNonConstCastOperator) {
    133  bool converted = false;
    134  Castable castable(&converted);
    135  Base base = ::testing::internal::ImplicitCast_<Base>(castable);
    136  EXPECT_TRUE(converted);
    137 }
    138 
    139 class ConstCastable {
    140 public:
    141  explicit ConstCastable(bool* converted) : converted_(converted) {}
    142  operator Base() const {
    143    *converted_ = true;
    144    return Base();
    145  }
    146 
    147 private:
    148  bool* converted_;
    149 };
    150 
    151 TEST(ImplicitCastTest, CanUseConstCastOperatorOnConstValues) {
    152  bool converted = false;
    153  const ConstCastable const_castable(&converted);
    154  Base base = ::testing::internal::ImplicitCast_<Base>(const_castable);
    155  EXPECT_TRUE(converted);
    156 }
    157 
    158 class ConstAndNonConstCastable {
    159 public:
    160  ConstAndNonConstCastable(bool* converted, bool* const_converted)
    161      : converted_(converted), const_converted_(const_converted) {}
    162  operator Base() {
    163    *converted_ = true;
    164    return Base();
    165  }
    166  operator Base() const {
    167    *const_converted_ = true;
    168    return Base();
    169  }
    170 
    171 private:
    172  bool* converted_;
    173  bool* const_converted_;
    174 };
    175 
    176 TEST(ImplicitCastTest, CanSelectBetweenConstAndNonConstCasrAppropriately) {
    177  bool converted = false;
    178  bool const_converted = false;
    179  ConstAndNonConstCastable castable(&converted, &const_converted);
    180  Base base = ::testing::internal::ImplicitCast_<Base>(castable);
    181  EXPECT_TRUE(converted);
    182  EXPECT_FALSE(const_converted);
    183 
    184  converted = false;
    185  const_converted = false;
    186  const ConstAndNonConstCastable const_castable(&converted, &const_converted);
    187  base = ::testing::internal::ImplicitCast_<Base>(const_castable);
    188  EXPECT_FALSE(converted);
    189  EXPECT_TRUE(const_converted);
    190 }
    191 
    192 class To {
    193 public:
    194  To(bool* converted) { *converted = true; }  // NOLINT
    195 };
    196 
    197 TEST(ImplicitCastTest, CanUseImplicitConstructor) {
    198  bool converted = false;
    199  To to = ::testing::internal::ImplicitCast_<To>(&converted);
    200  (void)to;
    201  EXPECT_TRUE(converted);
    202 }
    203 
    204 // The following code intentionally tests a suboptimal syntax.
    205 #ifdef __GNUC__
    206 #pragma GCC diagnostic push
    207 #pragma GCC diagnostic ignored "-Wdangling-else"
    208 #pragma GCC diagnostic ignored "-Wempty-body"
    209 #pragma GCC diagnostic ignored "-Wpragmas"
    210 #endif
    211 TEST(GtestCheckSyntaxTest, BehavesLikeASingleStatement) {
    212  if (AlwaysFalse())
    213    GTEST_CHECK_(false) << "This should never be executed; "
    214                           "It's a compilation test only.";
    215 
    216  if (AlwaysTrue())
    217    GTEST_CHECK_(true);
    218  else
    219    ;  // NOLINT
    220 
    221  if (AlwaysFalse())
    222    ;  // NOLINT
    223  else
    224    GTEST_CHECK_(true) << "";
    225 }
    226 #ifdef __GNUC__
    227 #pragma GCC diagnostic pop
    228 #endif
    229 
    230 TEST(GtestCheckSyntaxTest, WorksWithSwitch) {
    231  switch (0) {
    232    case 1:
    233      break;
    234    default:
    235      GTEST_CHECK_(true);
    236  }
    237 
    238  switch (0)
    239    case 0:
    240      GTEST_CHECK_(true) << "Check failed in switch case";
    241 }
    242 
    243 // Verifies behavior of FormatFileLocation.
    244 TEST(FormatFileLocationTest, FormatsFileLocation) {
    245  EXPECT_PRED_FORMAT2(IsSubstring, "foo.cc", FormatFileLocation("foo.cc", 42));
    246  EXPECT_PRED_FORMAT2(IsSubstring, "42", FormatFileLocation("foo.cc", 42));
    247 }
    248 
    249 TEST(FormatFileLocationTest, FormatsUnknownFile) {
    250  EXPECT_PRED_FORMAT2(IsSubstring, "unknown file",
    251                      FormatFileLocation(nullptr, 42));
    252  EXPECT_PRED_FORMAT2(IsSubstring, "42", FormatFileLocation(nullptr, 42));
    253 }
    254 
    255 TEST(FormatFileLocationTest, FormatsUknownLine) {
    256  EXPECT_EQ("foo.cc:", FormatFileLocation("foo.cc", -1));
    257 }
    258 
    259 TEST(FormatFileLocationTest, FormatsUknownFileAndLine) {
    260  EXPECT_EQ("unknown file:", FormatFileLocation(nullptr, -1));
    261 }
    262 
    263 // Verifies behavior of FormatCompilerIndependentFileLocation.
    264 TEST(FormatCompilerIndependentFileLocationTest, FormatsFileLocation) {
    265  EXPECT_EQ("foo.cc:42", FormatCompilerIndependentFileLocation("foo.cc", 42));
    266 }
    267 
    268 TEST(FormatCompilerIndependentFileLocationTest, FormatsUknownFile) {
    269  EXPECT_EQ("unknown file:42",
    270            FormatCompilerIndependentFileLocation(nullptr, 42));
    271 }
    272 
    273 TEST(FormatCompilerIndependentFileLocationTest, FormatsUknownLine) {
    274  EXPECT_EQ("foo.cc", FormatCompilerIndependentFileLocation("foo.cc", -1));
    275 }
    276 
    277 TEST(FormatCompilerIndependentFileLocationTest, FormatsUknownFileAndLine) {
    278  EXPECT_EQ("unknown file", FormatCompilerIndependentFileLocation(nullptr, -1));
    279 }
    280 
    281 #if GTEST_OS_LINUX || GTEST_OS_MAC || GTEST_OS_QNX || GTEST_OS_FUCHSIA || \
    282    GTEST_OS_DRAGONFLY || GTEST_OS_FREEBSD || GTEST_OS_GNU_KFREEBSD || \
    283    GTEST_OS_NETBSD || GTEST_OS_OPENBSD
    284 void* ThreadFunc(void* data) {
    285  internal::Mutex* mutex = static_cast<internal::Mutex*>(data);
    286  mutex->Lock();
    287  mutex->Unlock();
    288  return nullptr;
    289 }
    290 
    291 TEST(GetThreadCountTest, ReturnsCorrectValue) {
    292  const size_t starting_count = GetThreadCount();
    293  pthread_t       thread_id;
    294 
    295  internal::Mutex mutex;
    296  {
    297    internal::MutexLock lock(&mutex);
    298    pthread_attr_t  attr;
    299    ASSERT_EQ(0, pthread_attr_init(&attr));
    300    ASSERT_EQ(0, pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE));
    301 
    302    const int status = pthread_create(&thread_id, &attr, &ThreadFunc, &mutex);
    303    ASSERT_EQ(0, pthread_attr_destroy(&attr));
    304    ASSERT_EQ(0, status);
    305    EXPECT_EQ(starting_count + 1, GetThreadCount());
    306  }
    307 
    308  void* dummy;
    309  ASSERT_EQ(0, pthread_join(thread_id, &dummy));
    310 
    311  // The OS may not immediately report the updated thread count after
    312  // joining a thread, causing flakiness in this test. To counter that, we
    313  // wait for up to .5 seconds for the OS to report the correct value.
    314  for (int i = 0; i < 5; ++i) {
    315    if (GetThreadCount() == starting_count)
    316      break;
    317 
    318    SleepMilliseconds(100);
    319  }
    320 
    321  EXPECT_EQ(starting_count, GetThreadCount());
    322 }
    323 #else
    324 TEST(GetThreadCountTest, ReturnsZeroWhenUnableToCountThreads) {
    325  EXPECT_EQ(0U, GetThreadCount());
    326 }
    327 #endif  // GTEST_OS_LINUX || GTEST_OS_MAC || GTEST_OS_QNX || GTEST_OS_FUCHSIA
    328 
    329 TEST(GtestCheckDeathTest, DiesWithCorrectOutputOnFailure) {
    330  const bool a_false_condition = false;
    331  const char regex[] =
    332 #ifdef _MSC_VER
    333     "googletest-port-test\\.cc\\(\\d+\\):"
    334 #elif GTEST_USES_POSIX_RE
    335     "googletest-port-test\\.cc:[0-9]+"
    336 #else
    337     "googletest-port-test\\.cc:\\d+"
    338 #endif  // _MSC_VER
    339     ".*a_false_condition.*Extra info.*";
    340 
    341  EXPECT_DEATH_IF_SUPPORTED(GTEST_CHECK_(a_false_condition) << "Extra info",
    342                            regex);
    343 }
    344 
    345 #if GTEST_HAS_DEATH_TEST
    346 
    347 TEST(GtestCheckDeathTest, LivesSilentlyOnSuccess) {
    348  EXPECT_EXIT({
    349      GTEST_CHECK_(true) << "Extra info";
    350      ::std::cerr << "Success\n";
    351      exit(0); },
    352      ::testing::ExitedWithCode(0), "Success");
    353 }
    354 
    355 #endif  // GTEST_HAS_DEATH_TEST
    356 
    357 // Verifies that Google Test choose regular expression engine appropriate to
    358 // the platform. The test will produce compiler errors in case of failure.
    359 // For simplicity, we only cover the most important platforms here.
    360 TEST(RegexEngineSelectionTest, SelectsCorrectRegexEngine) {
    361 #if !GTEST_USES_PCRE
    362 # if GTEST_HAS_POSIX_RE
    363 
    364  EXPECT_TRUE(GTEST_USES_POSIX_RE);
    365 
    366 # else
    367 
    368  EXPECT_TRUE(GTEST_USES_SIMPLE_RE);
    369 
    370 # endif
    371 #endif  // !GTEST_USES_PCRE
    372 }
    373 
    374 #if GTEST_USES_POSIX_RE
    375 
    376 template <typename Str>
    377 class RETest : public ::testing::Test {};
    378 
    379 // Defines StringTypes as the list of all string types that class RE
    380 // supports.
    381 typedef testing::Types< ::std::string, const char*> StringTypes;
    382 
    383 TYPED_TEST_SUITE(RETest, StringTypes);
    384 
    385 // Tests RE's implicit constructors.
    386 TYPED_TEST(RETest, ImplicitConstructorWorks) {
    387  const RE empty(TypeParam(""));
    388  EXPECT_STREQ("", empty.pattern());
    389 
    390  const RE simple(TypeParam("hello"));
    391  EXPECT_STREQ("hello", simple.pattern());
    392 
    393  const RE normal(TypeParam(".*(\\w+)"));
    394  EXPECT_STREQ(".*(\\w+)", normal.pattern());
    395 }
    396 
    397 // Tests that RE's constructors reject invalid regular expressions.
    398 TYPED_TEST(RETest, RejectsInvalidRegex) {
    399  EXPECT_NONFATAL_FAILURE({
    400    const RE invalid(TypeParam("?"));
    401  }, "\"?\" is not a valid POSIX Extended regular expression.");
    402 }
    403 
    404 // Tests RE::FullMatch().
    405 TYPED_TEST(RETest, FullMatchWorks) {
    406  const RE empty(TypeParam(""));
    407  EXPECT_TRUE(RE::FullMatch(TypeParam(""), empty));
    408  EXPECT_FALSE(RE::FullMatch(TypeParam("a"), empty));
    409 
    410  const RE re(TypeParam("a.*z"));
    411  EXPECT_TRUE(RE::FullMatch(TypeParam("az"), re));
    412  EXPECT_TRUE(RE::FullMatch(TypeParam("axyz"), re));
    413  EXPECT_FALSE(RE::FullMatch(TypeParam("baz"), re));
    414  EXPECT_FALSE(RE::FullMatch(TypeParam("azy"), re));
    415 }
    416 
    417 // Tests RE::PartialMatch().
    418 TYPED_TEST(RETest, PartialMatchWorks) {
    419  const RE empty(TypeParam(""));
    420  EXPECT_TRUE(RE::PartialMatch(TypeParam(""), empty));
    421  EXPECT_TRUE(RE::PartialMatch(TypeParam("a"), empty));
    422 
    423  const RE re(TypeParam("a.*z"));
    424  EXPECT_TRUE(RE::PartialMatch(TypeParam("az"), re));
    425  EXPECT_TRUE(RE::PartialMatch(TypeParam("axyz"), re));
    426  EXPECT_TRUE(RE::PartialMatch(TypeParam("baz"), re));
    427  EXPECT_TRUE(RE::PartialMatch(TypeParam("azy"), re));
    428  EXPECT_FALSE(RE::PartialMatch(TypeParam("zza"), re));
    429 }
    430 
    431 #elif GTEST_USES_SIMPLE_RE
    432 
    433 TEST(IsInSetTest, NulCharIsNotInAnySet) {
    434  EXPECT_FALSE(IsInSet('\0', ""));
    435  EXPECT_FALSE(IsInSet('\0', "\0"));
    436  EXPECT_FALSE(IsInSet('\0', "a"));
    437 }
    438 
    439 TEST(IsInSetTest, WorksForNonNulChars) {
    440  EXPECT_FALSE(IsInSet('a', "Ab"));
    441  EXPECT_FALSE(IsInSet('c', ""));
    442 
    443  EXPECT_TRUE(IsInSet('b', "bcd"));
    444  EXPECT_TRUE(IsInSet('b', "ab"));
    445 }
    446 
    447 TEST(IsAsciiDigitTest, IsFalseForNonDigit) {
    448  EXPECT_FALSE(IsAsciiDigit('\0'));
    449  EXPECT_FALSE(IsAsciiDigit(' '));
    450  EXPECT_FALSE(IsAsciiDigit('+'));
    451  EXPECT_FALSE(IsAsciiDigit('-'));
    452  EXPECT_FALSE(IsAsciiDigit('.'));
    453  EXPECT_FALSE(IsAsciiDigit('a'));
    454 }
    455 
    456 TEST(IsAsciiDigitTest, IsTrueForDigit) {
    457  EXPECT_TRUE(IsAsciiDigit('0'));
    458  EXPECT_TRUE(IsAsciiDigit('1'));
    459  EXPECT_TRUE(IsAsciiDigit('5'));
    460  EXPECT_TRUE(IsAsciiDigit('9'));
    461 }
    462 
    463 TEST(IsAsciiPunctTest, IsFalseForNonPunct) {
    464  EXPECT_FALSE(IsAsciiPunct('\0'));
    465  EXPECT_FALSE(IsAsciiPunct(' '));
    466  EXPECT_FALSE(IsAsciiPunct('\n'));
    467  EXPECT_FALSE(IsAsciiPunct('a'));
    468  EXPECT_FALSE(IsAsciiPunct('0'));
    469 }
    470 
    471 TEST(IsAsciiPunctTest, IsTrueForPunct) {
    472  for (const char* p = "^-!\"#$%&'()*+,./:;<=>?@[\\]_`{|}~"; *p; p++) {
    473    EXPECT_PRED1(IsAsciiPunct, *p);
    474  }
    475 }
    476 
    477 TEST(IsRepeatTest, IsFalseForNonRepeatChar) {
    478  EXPECT_FALSE(IsRepeat('\0'));
    479  EXPECT_FALSE(IsRepeat(' '));
    480  EXPECT_FALSE(IsRepeat('a'));
    481  EXPECT_FALSE(IsRepeat('1'));
    482  EXPECT_FALSE(IsRepeat('-'));
    483 }
    484 
    485 TEST(IsRepeatTest, IsTrueForRepeatChar) {
    486  EXPECT_TRUE(IsRepeat('?'));
    487  EXPECT_TRUE(IsRepeat('*'));
    488  EXPECT_TRUE(IsRepeat('+'));
    489 }
    490 
    491 TEST(IsAsciiWhiteSpaceTest, IsFalseForNonWhiteSpace) {
    492  EXPECT_FALSE(IsAsciiWhiteSpace('\0'));
    493  EXPECT_FALSE(IsAsciiWhiteSpace('a'));
    494  EXPECT_FALSE(IsAsciiWhiteSpace('1'));
    495  EXPECT_FALSE(IsAsciiWhiteSpace('+'));
    496  EXPECT_FALSE(IsAsciiWhiteSpace('_'));
    497 }
    498 
    499 TEST(IsAsciiWhiteSpaceTest, IsTrueForWhiteSpace) {
    500  EXPECT_TRUE(IsAsciiWhiteSpace(' '));
    501  EXPECT_TRUE(IsAsciiWhiteSpace('\n'));
    502  EXPECT_TRUE(IsAsciiWhiteSpace('\r'));
    503  EXPECT_TRUE(IsAsciiWhiteSpace('\t'));
    504  EXPECT_TRUE(IsAsciiWhiteSpace('\v'));
    505  EXPECT_TRUE(IsAsciiWhiteSpace('\f'));
    506 }
    507 
    508 TEST(IsAsciiWordCharTest, IsFalseForNonWordChar) {
    509  EXPECT_FALSE(IsAsciiWordChar('\0'));
    510  EXPECT_FALSE(IsAsciiWordChar('+'));
    511  EXPECT_FALSE(IsAsciiWordChar('.'));
    512  EXPECT_FALSE(IsAsciiWordChar(' '));
    513  EXPECT_FALSE(IsAsciiWordChar('\n'));
    514 }
    515 
    516 TEST(IsAsciiWordCharTest, IsTrueForLetter) {
    517  EXPECT_TRUE(IsAsciiWordChar('a'));
    518  EXPECT_TRUE(IsAsciiWordChar('b'));
    519  EXPECT_TRUE(IsAsciiWordChar('A'));
    520  EXPECT_TRUE(IsAsciiWordChar('Z'));
    521 }
    522 
    523 TEST(IsAsciiWordCharTest, IsTrueForDigit) {
    524  EXPECT_TRUE(IsAsciiWordChar('0'));
    525  EXPECT_TRUE(IsAsciiWordChar('1'));
    526  EXPECT_TRUE(IsAsciiWordChar('7'));
    527  EXPECT_TRUE(IsAsciiWordChar('9'));
    528 }
    529 
    530 TEST(IsAsciiWordCharTest, IsTrueForUnderscore) {
    531  EXPECT_TRUE(IsAsciiWordChar('_'));
    532 }
    533 
    534 TEST(IsValidEscapeTest, IsFalseForNonPrintable) {
    535  EXPECT_FALSE(IsValidEscape('\0'));
    536  EXPECT_FALSE(IsValidEscape('\007'));
    537 }
    538 
    539 TEST(IsValidEscapeTest, IsFalseForDigit) {
    540  EXPECT_FALSE(IsValidEscape('0'));
    541  EXPECT_FALSE(IsValidEscape('9'));
    542 }
    543 
    544 TEST(IsValidEscapeTest, IsFalseForWhiteSpace) {
    545  EXPECT_FALSE(IsValidEscape(' '));
    546  EXPECT_FALSE(IsValidEscape('\n'));
    547 }
    548 
    549 TEST(IsValidEscapeTest, IsFalseForSomeLetter) {
    550  EXPECT_FALSE(IsValidEscape('a'));
    551  EXPECT_FALSE(IsValidEscape('Z'));
    552 }
    553 
    554 TEST(IsValidEscapeTest, IsTrueForPunct) {
    555  EXPECT_TRUE(IsValidEscape('.'));
    556  EXPECT_TRUE(IsValidEscape('-'));
    557  EXPECT_TRUE(IsValidEscape('^'));
    558  EXPECT_TRUE(IsValidEscape('$'));
    559  EXPECT_TRUE(IsValidEscape('('));
    560  EXPECT_TRUE(IsValidEscape(']'));
    561  EXPECT_TRUE(IsValidEscape('{'));
    562  EXPECT_TRUE(IsValidEscape('|'));
    563 }
    564 
    565 TEST(IsValidEscapeTest, IsTrueForSomeLetter) {
    566  EXPECT_TRUE(IsValidEscape('d'));
    567  EXPECT_TRUE(IsValidEscape('D'));
    568  EXPECT_TRUE(IsValidEscape('s'));
    569  EXPECT_TRUE(IsValidEscape('S'));
    570  EXPECT_TRUE(IsValidEscape('w'));
    571  EXPECT_TRUE(IsValidEscape('W'));
    572 }
    573 
    574 TEST(AtomMatchesCharTest, EscapedPunct) {
    575  EXPECT_FALSE(AtomMatchesChar(true, '\\', '\0'));
    576  EXPECT_FALSE(AtomMatchesChar(true, '\\', ' '));
    577  EXPECT_FALSE(AtomMatchesChar(true, '_', '.'));
    578  EXPECT_FALSE(AtomMatchesChar(true, '.', 'a'));
    579 
    580  EXPECT_TRUE(AtomMatchesChar(true, '\\', '\\'));
    581  EXPECT_TRUE(AtomMatchesChar(true, '_', '_'));
    582  EXPECT_TRUE(AtomMatchesChar(true, '+', '+'));
    583  EXPECT_TRUE(AtomMatchesChar(true, '.', '.'));
    584 }
    585 
    586 TEST(AtomMatchesCharTest, Escaped_d) {
    587  EXPECT_FALSE(AtomMatchesChar(true, 'd', '\0'));
    588  EXPECT_FALSE(AtomMatchesChar(true, 'd', 'a'));
    589  EXPECT_FALSE(AtomMatchesChar(true, 'd', '.'));
    590 
    591  EXPECT_TRUE(AtomMatchesChar(true, 'd', '0'));
    592  EXPECT_TRUE(AtomMatchesChar(true, 'd', '9'));
    593 }
    594 
    595 TEST(AtomMatchesCharTest, Escaped_D) {
    596  EXPECT_FALSE(AtomMatchesChar(true, 'D', '0'));
    597  EXPECT_FALSE(AtomMatchesChar(true, 'D', '9'));
    598 
    599  EXPECT_TRUE(AtomMatchesChar(true, 'D', '\0'));
    600  EXPECT_TRUE(AtomMatchesChar(true, 'D', 'a'));
    601  EXPECT_TRUE(AtomMatchesChar(true, 'D', '-'));
    602 }
    603 
    604 TEST(AtomMatchesCharTest, Escaped_s) {
    605  EXPECT_FALSE(AtomMatchesChar(true, 's', '\0'));
    606  EXPECT_FALSE(AtomMatchesChar(true, 's', 'a'));
    607  EXPECT_FALSE(AtomMatchesChar(true, 's', '.'));
    608  EXPECT_FALSE(AtomMatchesChar(true, 's', '9'));
    609 
    610  EXPECT_TRUE(AtomMatchesChar(true, 's', ' '));
    611  EXPECT_TRUE(AtomMatchesChar(true, 's', '\n'));
    612  EXPECT_TRUE(AtomMatchesChar(true, 's', '\t'));
    613 }
    614 
    615 TEST(AtomMatchesCharTest, Escaped_S) {
    616  EXPECT_FALSE(AtomMatchesChar(true, 'S', ' '));
    617  EXPECT_FALSE(AtomMatchesChar(true, 'S', '\r'));
    618 
    619  EXPECT_TRUE(AtomMatchesChar(true, 'S', '\0'));
    620  EXPECT_TRUE(AtomMatchesChar(true, 'S', 'a'));
    621  EXPECT_TRUE(AtomMatchesChar(true, 'S', '9'));
    622 }
    623 
    624 TEST(AtomMatchesCharTest, Escaped_w) {
    625  EXPECT_FALSE(AtomMatchesChar(true, 'w', '\0'));
    626  EXPECT_FALSE(AtomMatchesChar(true, 'w', '+'));
    627  EXPECT_FALSE(AtomMatchesChar(true, 'w', ' '));
    628  EXPECT_FALSE(AtomMatchesChar(true, 'w', '\n'));
    629 
    630  EXPECT_TRUE(AtomMatchesChar(true, 'w', '0'));
    631  EXPECT_TRUE(AtomMatchesChar(true, 'w', 'b'));
    632  EXPECT_TRUE(AtomMatchesChar(true, 'w', 'C'));
    633  EXPECT_TRUE(AtomMatchesChar(true, 'w', '_'));
    634 }
    635 
    636 TEST(AtomMatchesCharTest, Escaped_W) {
    637  EXPECT_FALSE(AtomMatchesChar(true, 'W', 'A'));
    638  EXPECT_FALSE(AtomMatchesChar(true, 'W', 'b'));
    639  EXPECT_FALSE(AtomMatchesChar(true, 'W', '9'));
    640  EXPECT_FALSE(AtomMatchesChar(true, 'W', '_'));
    641 
    642  EXPECT_TRUE(AtomMatchesChar(true, 'W', '\0'));
    643  EXPECT_TRUE(AtomMatchesChar(true, 'W', '*'));
    644  EXPECT_TRUE(AtomMatchesChar(true, 'W', '\n'));
    645 }
    646 
    647 TEST(AtomMatchesCharTest, EscapedWhiteSpace) {
    648  EXPECT_FALSE(AtomMatchesChar(true, 'f', '\0'));
    649  EXPECT_FALSE(AtomMatchesChar(true, 'f', '\n'));
    650  EXPECT_FALSE(AtomMatchesChar(true, 'n', '\0'));
    651  EXPECT_FALSE(AtomMatchesChar(true, 'n', '\r'));
    652  EXPECT_FALSE(AtomMatchesChar(true, 'r', '\0'));
    653  EXPECT_FALSE(AtomMatchesChar(true, 'r', 'a'));
    654  EXPECT_FALSE(AtomMatchesChar(true, 't', '\0'));
    655  EXPECT_FALSE(AtomMatchesChar(true, 't', 't'));
    656  EXPECT_FALSE(AtomMatchesChar(true, 'v', '\0'));
    657  EXPECT_FALSE(AtomMatchesChar(true, 'v', '\f'));
    658 
    659  EXPECT_TRUE(AtomMatchesChar(true, 'f', '\f'));
    660  EXPECT_TRUE(AtomMatchesChar(true, 'n', '\n'));
    661  EXPECT_TRUE(AtomMatchesChar(true, 'r', '\r'));
    662  EXPECT_TRUE(AtomMatchesChar(true, 't', '\t'));
    663  EXPECT_TRUE(AtomMatchesChar(true, 'v', '\v'));
    664 }
    665 
    666 TEST(AtomMatchesCharTest, UnescapedDot) {
    667  EXPECT_FALSE(AtomMatchesChar(false, '.', '\n'));
    668 
    669  EXPECT_TRUE(AtomMatchesChar(false, '.', '\0'));
    670  EXPECT_TRUE(AtomMatchesChar(false, '.', '.'));
    671  EXPECT_TRUE(AtomMatchesChar(false, '.', 'a'));
    672  EXPECT_TRUE(AtomMatchesChar(false, '.', ' '));
    673 }
    674 
    675 TEST(AtomMatchesCharTest, UnescapedChar) {
    676  EXPECT_FALSE(AtomMatchesChar(false, 'a', '\0'));
    677  EXPECT_FALSE(AtomMatchesChar(false, 'a', 'b'));
    678  EXPECT_FALSE(AtomMatchesChar(false, '$', 'a'));
    679 
    680  EXPECT_TRUE(AtomMatchesChar(false, '$', '$'));
    681  EXPECT_TRUE(AtomMatchesChar(false, '5', '5'));
    682  EXPECT_TRUE(AtomMatchesChar(false, 'Z', 'Z'));
    683 }
    684 
    685 TEST(ValidateRegexTest, GeneratesFailureAndReturnsFalseForInvalid) {
    686  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex(NULL)),
    687                          "NULL is not a valid simple regular expression");
    688  EXPECT_NONFATAL_FAILURE(
    689      ASSERT_FALSE(ValidateRegex("a\\")),
    690      "Syntax error at index 1 in simple regular expression \"a\\\": ");
    691  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("a\\")),
    692                          "'\\' cannot appear at the end");
    693  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("\\n\\")),
    694                          "'\\' cannot appear at the end");
    695  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("\\s\\hb")),
    696                          "invalid escape sequence \"\\h\"");
    697  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("^^")),
    698                          "'^' can only appear at the beginning");
    699  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex(".*^b")),
    700                          "'^' can only appear at the beginning");
    701  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("$$")),
    702                          "'$' can only appear at the end");
    703  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("^$a")),
    704                          "'$' can only appear at the end");
    705  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("a(b")),
    706                          "'(' is unsupported");
    707  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("ab)")),
    708                          "')' is unsupported");
    709  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("[ab")),
    710                          "'[' is unsupported");
    711  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("a{2")),
    712                          "'{' is unsupported");
    713  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("?")),
    714                          "'?' can only follow a repeatable token");
    715  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("^*")),
    716                          "'*' can only follow a repeatable token");
    717  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("5*+")),
    718                          "'+' can only follow a repeatable token");
    719 }
    720 
    721 TEST(ValidateRegexTest, ReturnsTrueForValid) {
    722  EXPECT_TRUE(ValidateRegex(""));
    723  EXPECT_TRUE(ValidateRegex("a"));
    724  EXPECT_TRUE(ValidateRegex(".*"));
    725  EXPECT_TRUE(ValidateRegex("^a_+"));
    726  EXPECT_TRUE(ValidateRegex("^a\\t\\&?"));
    727  EXPECT_TRUE(ValidateRegex("09*$"));
    728  EXPECT_TRUE(ValidateRegex("^Z$"));
    729  EXPECT_TRUE(ValidateRegex("a\\^Z\\$\\(\\)\\|\\[\\]\\{\\}"));
    730 }
    731 
    732 TEST(MatchRepetitionAndRegexAtHeadTest, WorksForZeroOrOne) {
    733  EXPECT_FALSE(MatchRepetitionAndRegexAtHead(false, 'a', '?', "a", "ba"));
    734  // Repeating more than once.
    735  EXPECT_FALSE(MatchRepetitionAndRegexAtHead(false, 'a', '?', "b", "aab"));
    736 
    737  // Repeating zero times.
    738  EXPECT_TRUE(MatchRepetitionAndRegexAtHead(false, 'a', '?', "b", "ba"));
    739  // Repeating once.
    740  EXPECT_TRUE(MatchRepetitionAndRegexAtHead(false, 'a', '?', "b", "ab"));
    741  EXPECT_TRUE(MatchRepetitionAndRegexAtHead(false, '#', '?', ".", "##"));
    742 }
    743 
    744 TEST(MatchRepetitionAndRegexAtHeadTest, WorksForZeroOrMany) {
    745  EXPECT_FALSE(MatchRepetitionAndRegexAtHead(false, '.', '*', "a$", "baab"));
    746 
    747  // Repeating zero times.
    748  EXPECT_TRUE(MatchRepetitionAndRegexAtHead(false, '.', '*', "b", "bc"));
    749  // Repeating once.
    750  EXPECT_TRUE(MatchRepetitionAndRegexAtHead(false, '.', '*', "b", "abc"));
    751  // Repeating more than once.
    752  EXPECT_TRUE(MatchRepetitionAndRegexAtHead(true, 'w', '*', "-", "ab_1-g"));
    753 }
    754 
    755 TEST(MatchRepetitionAndRegexAtHeadTest, WorksForOneOrMany) {
    756  EXPECT_FALSE(MatchRepetitionAndRegexAtHead(false, '.', '+', "a$", "baab"));
    757  // Repeating zero times.
    758  EXPECT_FALSE(MatchRepetitionAndRegexAtHead(false, '.', '+', "b", "bc"));
    759 
    760  // Repeating once.
    761  EXPECT_TRUE(MatchRepetitionAndRegexAtHead(false, '.', '+', "b", "abc"));
    762  // Repeating more than once.
    763  EXPECT_TRUE(MatchRepetitionAndRegexAtHead(true, 'w', '+', "-", "ab_1-g"));
    764 }
    765 
    766 TEST(MatchRegexAtHeadTest, ReturnsTrueForEmptyRegex) {
    767  EXPECT_TRUE(MatchRegexAtHead("", ""));
    768  EXPECT_TRUE(MatchRegexAtHead("", "ab"));
    769 }
    770 
    771 TEST(MatchRegexAtHeadTest, WorksWhenDollarIsInRegex) {
    772  EXPECT_FALSE(MatchRegexAtHead("$", "a"));
    773 
    774  EXPECT_TRUE(MatchRegexAtHead("$", ""));
    775  EXPECT_TRUE(MatchRegexAtHead("a$", "a"));
    776 }
    777 
    778 TEST(MatchRegexAtHeadTest, WorksWhenRegexStartsWithEscapeSequence) {
    779  EXPECT_FALSE(MatchRegexAtHead("\\w", "+"));
    780  EXPECT_FALSE(MatchRegexAtHead("\\W", "ab"));
    781 
    782  EXPECT_TRUE(MatchRegexAtHead("\\sa", "\nab"));
    783  EXPECT_TRUE(MatchRegexAtHead("\\d", "1a"));
    784 }
    785 
    786 TEST(MatchRegexAtHeadTest, WorksWhenRegexStartsWithRepetition) {
    787  EXPECT_FALSE(MatchRegexAtHead(".+a", "abc"));
    788  EXPECT_FALSE(MatchRegexAtHead("a?b", "aab"));
    789 
    790  EXPECT_TRUE(MatchRegexAtHead(".*a", "bc12-ab"));
    791  EXPECT_TRUE(MatchRegexAtHead("a?b", "b"));
    792  EXPECT_TRUE(MatchRegexAtHead("a?b", "ab"));
    793 }
    794 
    795 TEST(MatchRegexAtHeadTest,
    796     WorksWhenRegexStartsWithRepetionOfEscapeSequence) {
    797  EXPECT_FALSE(MatchRegexAtHead("\\.+a", "abc"));
    798  EXPECT_FALSE(MatchRegexAtHead("\\s?b", "  b"));
    799 
    800  EXPECT_TRUE(MatchRegexAtHead("\\(*a", "((((ab"));
    801  EXPECT_TRUE(MatchRegexAtHead("\\^?b", "^b"));
    802  EXPECT_TRUE(MatchRegexAtHead("\\\\?b", "b"));
    803  EXPECT_TRUE(MatchRegexAtHead("\\\\?b", "\\b"));
    804 }
    805 
    806 TEST(MatchRegexAtHeadTest, MatchesSequentially) {
    807  EXPECT_FALSE(MatchRegexAtHead("ab.*c", "acabc"));
    808 
    809  EXPECT_TRUE(MatchRegexAtHead("ab.*c", "ab-fsc"));
    810 }
    811 
    812 TEST(MatchRegexAnywhereTest, ReturnsFalseWhenStringIsNull) {
    813  EXPECT_FALSE(MatchRegexAnywhere("", NULL));
    814 }
    815 
    816 TEST(MatchRegexAnywhereTest, WorksWhenRegexStartsWithCaret) {
    817  EXPECT_FALSE(MatchRegexAnywhere("^a", "ba"));
    818  EXPECT_FALSE(MatchRegexAnywhere("^$", "a"));
    819 
    820  EXPECT_TRUE(MatchRegexAnywhere("^a", "ab"));
    821  EXPECT_TRUE(MatchRegexAnywhere("^", "ab"));
    822  EXPECT_TRUE(MatchRegexAnywhere("^$", ""));
    823 }
    824 
    825 TEST(MatchRegexAnywhereTest, ReturnsFalseWhenNoMatch) {
    826  EXPECT_FALSE(MatchRegexAnywhere("a", "bcde123"));
    827  EXPECT_FALSE(MatchRegexAnywhere("a.+a", "--aa88888888"));
    828 }
    829 
    830 TEST(MatchRegexAnywhereTest, ReturnsTrueWhenMatchingPrefix) {
    831  EXPECT_TRUE(MatchRegexAnywhere("\\w+", "ab1_ - 5"));
    832  EXPECT_TRUE(MatchRegexAnywhere(".*=", "="));
    833  EXPECT_TRUE(MatchRegexAnywhere("x.*ab?.*bc", "xaaabc"));
    834 }
    835 
    836 TEST(MatchRegexAnywhereTest, ReturnsTrueWhenMatchingNonPrefix) {
    837  EXPECT_TRUE(MatchRegexAnywhere("\\w+", "$$$ ab1_ - 5"));
    838  EXPECT_TRUE(MatchRegexAnywhere("\\.+=", "=  ...="));
    839 }
    840 
    841 // Tests RE's implicit constructors.
    842 TEST(RETest, ImplicitConstructorWorks) {
    843  const RE empty("");
    844  EXPECT_STREQ("", empty.pattern());
    845 
    846  const RE simple("hello");
    847  EXPECT_STREQ("hello", simple.pattern());
    848 }
    849 
    850 // Tests that RE's constructors reject invalid regular expressions.
    851 TEST(RETest, RejectsInvalidRegex) {
    852  EXPECT_NONFATAL_FAILURE({
    853    const RE normal(NULL);
    854  }, "NULL is not a valid simple regular expression");
    855 
    856  EXPECT_NONFATAL_FAILURE({
    857    const RE normal(".*(\\w+");
    858  }, "'(' is unsupported");
    859 
    860  EXPECT_NONFATAL_FAILURE({
    861    const RE invalid("^?");
    862  }, "'?' can only follow a repeatable token");
    863 }
    864 
    865 // Tests RE::FullMatch().
    866 TEST(RETest, FullMatchWorks) {
    867  const RE empty("");
    868  EXPECT_TRUE(RE::FullMatch("", empty));
    869  EXPECT_FALSE(RE::FullMatch("a", empty));
    870 
    871  const RE re1("a");
    872  EXPECT_TRUE(RE::FullMatch("a", re1));
    873 
    874  const RE re("a.*z");
    875  EXPECT_TRUE(RE::FullMatch("az", re));
    876  EXPECT_TRUE(RE::FullMatch("axyz", re));
    877  EXPECT_FALSE(RE::FullMatch("baz", re));
    878  EXPECT_FALSE(RE::FullMatch("azy", re));
    879 }
    880 
    881 // Tests RE::PartialMatch().
    882 TEST(RETest, PartialMatchWorks) {
    883  const RE empty("");
    884  EXPECT_TRUE(RE::PartialMatch("", empty));
    885  EXPECT_TRUE(RE::PartialMatch("a", empty));
    886 
    887  const RE re("a.*z");
    888  EXPECT_TRUE(RE::PartialMatch("az", re));
    889  EXPECT_TRUE(RE::PartialMatch("axyz", re));
    890  EXPECT_TRUE(RE::PartialMatch("baz", re));
    891  EXPECT_TRUE(RE::PartialMatch("azy", re));
    892  EXPECT_FALSE(RE::PartialMatch("zza", re));
    893 }
    894 
    895 #endif  // GTEST_USES_POSIX_RE
    896 
    897 #if !GTEST_OS_WINDOWS_MOBILE
    898 
    899 TEST(CaptureTest, CapturesStdout) {
    900  CaptureStdout();
    901  fprintf(stdout, "abc");
    902  EXPECT_STREQ("abc", GetCapturedStdout().c_str());
    903 
    904  CaptureStdout();
    905  fprintf(stdout, "def%cghi", '\0');
    906  EXPECT_EQ(::std::string("def\0ghi", 7), ::std::string(GetCapturedStdout()));
    907 }
    908 
    909 TEST(CaptureTest, CapturesStderr) {
    910  CaptureStderr();
    911  fprintf(stderr, "jkl");
    912  EXPECT_STREQ("jkl", GetCapturedStderr().c_str());
    913 
    914  CaptureStderr();
    915  fprintf(stderr, "jkl%cmno", '\0');
    916  EXPECT_EQ(::std::string("jkl\0mno", 7), ::std::string(GetCapturedStderr()));
    917 }
    918 
    919 // Tests that stdout and stderr capture don't interfere with each other.
    920 TEST(CaptureTest, CapturesStdoutAndStderr) {
    921  CaptureStdout();
    922  CaptureStderr();
    923  fprintf(stdout, "pqr");
    924  fprintf(stderr, "stu");
    925  EXPECT_STREQ("pqr", GetCapturedStdout().c_str());
    926  EXPECT_STREQ("stu", GetCapturedStderr().c_str());
    927 }
    928 
    929 TEST(CaptureDeathTest, CannotReenterStdoutCapture) {
    930  CaptureStdout();
    931  EXPECT_DEATH_IF_SUPPORTED(CaptureStdout(),
    932                            "Only one stdout capturer can exist at a time");
    933  GetCapturedStdout();
    934 
    935  // We cannot test stderr capturing using death tests as they use it
    936  // themselves.
    937 }
    938 
    939 #endif  // !GTEST_OS_WINDOWS_MOBILE
    940 
    941 TEST(ThreadLocalTest, DefaultConstructorInitializesToDefaultValues) {
    942  ThreadLocal<int> t1;
    943  EXPECT_EQ(0, t1.get());
    944 
    945  ThreadLocal<void*> t2;
    946  EXPECT_TRUE(t2.get() == nullptr);
    947 }
    948 
    949 TEST(ThreadLocalTest, SingleParamConstructorInitializesToParam) {
    950  ThreadLocal<int> t1(123);
    951  EXPECT_EQ(123, t1.get());
    952 
    953  int i = 0;
    954  ThreadLocal<int*> t2(&i);
    955  EXPECT_EQ(&i, t2.get());
    956 }
    957 
    958 class NoDefaultContructor {
    959 public:
    960  explicit NoDefaultContructor(const char*) {}
    961  NoDefaultContructor(const NoDefaultContructor&) {}
    962 };
    963 
    964 TEST(ThreadLocalTest, ValueDefaultContructorIsNotRequiredForParamVersion) {
    965  ThreadLocal<NoDefaultContructor> bar(NoDefaultContructor("foo"));
    966  bar.pointer();
    967 }
    968 
    969 TEST(ThreadLocalTest, GetAndPointerReturnSameValue) {
    970  ThreadLocal<std::string> thread_local_string;
    971 
    972  EXPECT_EQ(thread_local_string.pointer(), &(thread_local_string.get()));
    973 
    974  // Verifies the condition still holds after calling set.
    975  thread_local_string.set("foo");
    976  EXPECT_EQ(thread_local_string.pointer(), &(thread_local_string.get()));
    977 }
    978 
    979 TEST(ThreadLocalTest, PointerAndConstPointerReturnSameValue) {
    980  ThreadLocal<std::string> thread_local_string;
    981  const ThreadLocal<std::string>& const_thread_local_string =
    982      thread_local_string;
    983 
    984  EXPECT_EQ(thread_local_string.pointer(), const_thread_local_string.pointer());
    985 
    986  thread_local_string.set("foo");
    987  EXPECT_EQ(thread_local_string.pointer(), const_thread_local_string.pointer());
    988 }
    989 
    990 #if GTEST_IS_THREADSAFE
    991 
    992 void AddTwo(int* param) { *param += 2; }
    993 
    994 TEST(ThreadWithParamTest, ConstructorExecutesThreadFunc) {
    995  int i = 40;
    996  ThreadWithParam<int*> thread(&AddTwo, &i, nullptr);
    997  thread.Join();
    998  EXPECT_EQ(42, i);
    999 }
   1000 
   1001 TEST(MutexDeathTest, AssertHeldShouldAssertWhenNotLocked) {
   1002  // AssertHeld() is flaky only in the presence of multiple threads accessing
   1003  // the lock. In this case, the test is robust.
   1004  EXPECT_DEATH_IF_SUPPORTED({
   1005    Mutex m;
   1006    { MutexLock lock(&m); }
   1007    m.AssertHeld();
   1008  },
   1009  "thread .*hold");
   1010 }
   1011 
   1012 TEST(MutexTest, AssertHeldShouldNotAssertWhenLocked) {
   1013  Mutex m;
   1014  MutexLock lock(&m);
   1015  m.AssertHeld();
   1016 }
   1017 
   1018 class AtomicCounterWithMutex {
   1019 public:
   1020  explicit AtomicCounterWithMutex(Mutex* mutex) :
   1021    value_(0), mutex_(mutex), random_(42) {}
   1022 
   1023  void Increment() {
   1024    MutexLock lock(mutex_);
   1025    int temp = value_;
   1026    {
   1027      // We need to put up a memory barrier to prevent reads and writes to
   1028      // value_ rearranged with the call to SleepMilliseconds when observed
   1029      // from other threads.
   1030 #if GTEST_HAS_PTHREAD
   1031      // On POSIX, locking a mutex puts up a memory barrier.  We cannot use
   1032      // Mutex and MutexLock here or rely on their memory barrier
   1033      // functionality as we are testing them here.
   1034      pthread_mutex_t memory_barrier_mutex;
   1035      GTEST_CHECK_POSIX_SUCCESS_(
   1036          pthread_mutex_init(&memory_barrier_mutex, nullptr));
   1037      GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_lock(&memory_barrier_mutex));
   1038 
   1039      SleepMilliseconds(static_cast<int>(random_.Generate(30)));
   1040 
   1041      GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_unlock(&memory_barrier_mutex));
   1042      GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_destroy(&memory_barrier_mutex));
   1043 #elif GTEST_OS_WINDOWS
   1044      // On Windows, performing an interlocked access puts up a memory barrier.
   1045      volatile LONG dummy = 0;
   1046      ::InterlockedIncrement(&dummy);
   1047      SleepMilliseconds(static_cast<int>(random_.Generate(30)));
   1048      ::InterlockedIncrement(&dummy);
   1049 #else
   1050 # error "Memory barrier not implemented on this platform."
   1051 #endif  // GTEST_HAS_PTHREAD
   1052    }
   1053    value_ = temp + 1;
   1054  }
   1055  int value() const { return value_; }
   1056 
   1057 private:
   1058  volatile int value_;
   1059  Mutex* const mutex_;  // Protects value_.
   1060  Random       random_;
   1061 };
   1062 
   1063 void CountingThreadFunc(pair<AtomicCounterWithMutex*, int> param) {
   1064  for (int i = 0; i < param.second; ++i)
   1065      param.first->Increment();
   1066 }
   1067 
   1068 // Tests that the mutex only lets one thread at a time to lock it.
   1069 TEST(MutexTest, OnlyOneThreadCanLockAtATime) {
   1070  Mutex mutex;
   1071  AtomicCounterWithMutex locked_counter(&mutex);
   1072 
   1073  typedef ThreadWithParam<pair<AtomicCounterWithMutex*, int> > ThreadType;
   1074  const int kCycleCount = 20;
   1075  const int kThreadCount = 7;
   1076  std::unique_ptr<ThreadType> counting_threads[kThreadCount];
   1077  Notification threads_can_start;
   1078  // Creates and runs kThreadCount threads that increment locked_counter
   1079  // kCycleCount times each.
   1080  for (int i = 0; i < kThreadCount; ++i) {
   1081    counting_threads[i].reset(new ThreadType(&CountingThreadFunc,
   1082                                             make_pair(&locked_counter,
   1083                                                       kCycleCount),
   1084                                             &threads_can_start));
   1085  }
   1086  threads_can_start.Notify();
   1087  for (int i = 0; i < kThreadCount; ++i)
   1088    counting_threads[i]->Join();
   1089 
   1090  // If the mutex lets more than one thread to increment the counter at a
   1091  // time, they are likely to encounter a race condition and have some
   1092  // increments overwritten, resulting in the lower then expected counter
   1093  // value.
   1094  EXPECT_EQ(kCycleCount * kThreadCount, locked_counter.value());
   1095 }
   1096 
   1097 template <typename T>
   1098 void RunFromThread(void (func)(T), T param) {
   1099  ThreadWithParam<T> thread(func, param, nullptr);
   1100  thread.Join();
   1101 }
   1102 
   1103 void RetrieveThreadLocalValue(
   1104    pair<ThreadLocal<std::string>*, std::string*> param) {
   1105  *param.second = param.first->get();
   1106 }
   1107 
   1108 TEST(ThreadLocalTest, ParameterizedConstructorSetsDefault) {
   1109  ThreadLocal<std::string> thread_local_string("foo");
   1110  EXPECT_STREQ("foo", thread_local_string.get().c_str());
   1111 
   1112  thread_local_string.set("bar");
   1113  EXPECT_STREQ("bar", thread_local_string.get().c_str());
   1114 
   1115  std::string result;
   1116  RunFromThread(&RetrieveThreadLocalValue,
   1117                make_pair(&thread_local_string, &result));
   1118  EXPECT_STREQ("foo", result.c_str());
   1119 }
   1120 
   1121 // Keeps track of whether of destructors being called on instances of
   1122 // DestructorTracker.  On Windows, waits for the destructor call reports.
   1123 class DestructorCall {
   1124 public:
   1125  DestructorCall() {
   1126    invoked_ = false;
   1127 #if GTEST_OS_WINDOWS
   1128    wait_event_.Reset(::CreateEvent(NULL, TRUE, FALSE, NULL));
   1129    GTEST_CHECK_(wait_event_.Get() != NULL);
   1130 #endif
   1131  }
   1132 
   1133  bool CheckDestroyed() const {
   1134 #if GTEST_OS_WINDOWS
   1135    if (::WaitForSingleObject(wait_event_.Get(), 1000) != WAIT_OBJECT_0)
   1136      return false;
   1137 #endif
   1138    return invoked_;
   1139  }
   1140 
   1141  void ReportDestroyed() {
   1142    invoked_ = true;
   1143 #if GTEST_OS_WINDOWS
   1144    ::SetEvent(wait_event_.Get());
   1145 #endif
   1146  }
   1147 
   1148  static std::vector<DestructorCall*>& List() { return *list_; }
   1149 
   1150  static void ResetList() {
   1151    for (size_t i = 0; i < list_->size(); ++i) {
   1152      delete list_->at(i);
   1153    }
   1154    list_->clear();
   1155  }
   1156 
   1157 private:
   1158  bool invoked_;
   1159 #if GTEST_OS_WINDOWS
   1160  AutoHandle wait_event_;
   1161 #endif
   1162  static std::vector<DestructorCall*>* const list_;
   1163 
   1164  GTEST_DISALLOW_COPY_AND_ASSIGN_(DestructorCall);
   1165 };
   1166 
   1167 std::vector<DestructorCall*>* const DestructorCall::list_ =
   1168    new std::vector<DestructorCall*>;
   1169 
   1170 // DestructorTracker keeps track of whether its instances have been
   1171 // destroyed.
   1172 class DestructorTracker {
   1173 public:
   1174  DestructorTracker() : index_(GetNewIndex()) {}
   1175  DestructorTracker(const DestructorTracker& /* rhs */)
   1176      : index_(GetNewIndex()) {}
   1177  ~DestructorTracker() {
   1178    // We never access DestructorCall::List() concurrently, so we don't need
   1179    // to protect this access with a mutex.
   1180    DestructorCall::List()[index_]->ReportDestroyed();
   1181  }
   1182 
   1183 private:
   1184  static size_t GetNewIndex() {
   1185    DestructorCall::List().push_back(new DestructorCall);
   1186    return DestructorCall::List().size() - 1;
   1187  }
   1188  const size_t index_;
   1189 };
   1190 
   1191 typedef ThreadLocal<DestructorTracker>* ThreadParam;
   1192 
   1193 void CallThreadLocalGet(ThreadParam thread_local_param) {
   1194  thread_local_param->get();
   1195 }
   1196 
   1197 // Tests that when a ThreadLocal object dies in a thread, it destroys
   1198 // the managed object for that thread.
   1199 TEST(ThreadLocalTest, DestroysManagedObjectForOwnThreadWhenDying) {
   1200  DestructorCall::ResetList();
   1201 
   1202  {
   1203    ThreadLocal<DestructorTracker> thread_local_tracker;
   1204    ASSERT_EQ(0U, DestructorCall::List().size());
   1205 
   1206    // This creates another DestructorTracker object for the main thread.
   1207    thread_local_tracker.get();
   1208    ASSERT_EQ(1U, DestructorCall::List().size());
   1209    ASSERT_FALSE(DestructorCall::List()[0]->CheckDestroyed());
   1210  }
   1211 
   1212  // Now thread_local_tracker has died.
   1213  ASSERT_EQ(1U, DestructorCall::List().size());
   1214  EXPECT_TRUE(DestructorCall::List()[0]->CheckDestroyed());
   1215 
   1216  DestructorCall::ResetList();
   1217 }
   1218 
   1219 // Tests that when a thread exits, the thread-local object for that
   1220 // thread is destroyed.
   1221 TEST(ThreadLocalTest, DestroysManagedObjectAtThreadExit) {
   1222  DestructorCall::ResetList();
   1223 
   1224  {
   1225    ThreadLocal<DestructorTracker> thread_local_tracker;
   1226    ASSERT_EQ(0U, DestructorCall::List().size());
   1227 
   1228    // This creates another DestructorTracker object in the new thread.
   1229    ThreadWithParam<ThreadParam> thread(&CallThreadLocalGet,
   1230                                        &thread_local_tracker, nullptr);
   1231    thread.Join();
   1232 
   1233    // The thread has exited, and we should have a DestroyedTracker
   1234    // instance created for it. But it may not have been destroyed yet.
   1235    ASSERT_EQ(1U, DestructorCall::List().size());
   1236  }
   1237 
   1238  // The thread has exited and thread_local_tracker has died.
   1239  ASSERT_EQ(1U, DestructorCall::List().size());
   1240  EXPECT_TRUE(DestructorCall::List()[0]->CheckDestroyed());
   1241 
   1242  DestructorCall::ResetList();
   1243 }
   1244 
   1245 TEST(ThreadLocalTest, ThreadLocalMutationsAffectOnlyCurrentThread) {
   1246  ThreadLocal<std::string> thread_local_string;
   1247  thread_local_string.set("Foo");
   1248  EXPECT_STREQ("Foo", thread_local_string.get().c_str());
   1249 
   1250  std::string result;
   1251  RunFromThread(&RetrieveThreadLocalValue,
   1252                make_pair(&thread_local_string, &result));
   1253  EXPECT_TRUE(result.empty());
   1254 }
   1255 
   1256 #endif  // GTEST_IS_THREADSAFE
   1257 
   1258 #if GTEST_OS_WINDOWS
   1259 TEST(WindowsTypesTest, HANDLEIsVoidStar) {
   1260  StaticAssertTypeEq<HANDLE, void*>();
   1261 }
   1262 
   1263 #if GTEST_OS_WINDOWS_MINGW && !defined(__MINGW64_VERSION_MAJOR)
   1264 TEST(WindowsTypesTest, _CRITICAL_SECTIONIs_CRITICAL_SECTION) {
   1265  StaticAssertTypeEq<CRITICAL_SECTION, _CRITICAL_SECTION>();
   1266 }
   1267 #else
   1268 TEST(WindowsTypesTest, CRITICAL_SECTIONIs_RTL_CRITICAL_SECTION) {
   1269  StaticAssertTypeEq<CRITICAL_SECTION, _RTL_CRITICAL_SECTION>();
   1270 }
   1271 #endif
   1272 
   1273 #endif  // GTEST_OS_WINDOWS
   1274 
   1275 }  // namespace internal
   1276 }  // namespace testing