github.com/jlmucb/cloudproxy@v0.0.0-20170830161738-b5aa0b619bc4/src/third_party/googlemock/gtest/test/gtest-port_test.cc (about)

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