1 // Copyright 2005, 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 // Utility functions and classes used by the Google C++ testing framework.//
  31 // This file contains purely Google Test's internal implementation.  Please
  32 // DO NOT #INCLUDE IT IN A USER PROGRAM.
  33 
  34 #ifndef GTEST_SRC_GTEST_INTERNAL_INL_H_
  35 #define GTEST_SRC_GTEST_INTERNAL_INL_H_
  36 
  37 #ifndef _WIN32_WCE
  38 # include <errno.h>
  39 #endif  // !_WIN32_WCE
  40 #include <stddef.h>
  41 #include <stdlib.h>  // For strtoll/_strtoul64/malloc/free.
  42 #include <string.h>  // For memmove.
  43 
  44 #include <algorithm>
  45 #include <string>
  46 #include <vector>
  47 
  48 #include "gtest/internal/gtest-port.h"
  49 
  50 #if GTEST_CAN_STREAM_RESULTS_
  51 # include <arpa/inet.h>  // NOLINT
  52 # include <netdb.h>  // NOLINT
  53 #endif
  54 
  55 #if GTEST_OS_WINDOWS
  56 # include <windows.h>  // NOLINT
  57 #endif  // GTEST_OS_WINDOWS
  58 
  59 #include "gtest/gtest.h"
  60 #include "gtest/gtest-spi.h"
  61 
  62 GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \
  63 /* class A needs to have dll-interface to be used by clients of class B */)
  64 
  65 namespace testing {
  66 
  67 // Declares the flags.
  68 //
  69 // We don't want the users to modify this flag in the code, but want
  70 // Google Test's own unit tests to be able to access it. Therefore we
  71 // declare it here as opposed to in gtest.h.
  72 GTEST_DECLARE_bool_(death_test_use_fork);
  73 
  74 namespace internal {
  75 
  76 // The value of GetTestTypeId() as seen from within the Google Test
  77 // library.  This is solely for testing GetTestTypeId().
  78 GTEST_API_ extern const TypeId kTestTypeIdInGoogleTest;
  79 
  80 // Names of the flags (needed for parsing Google Test flags).
  81 const char kAlsoRunDisabledTestsFlag[] = "also_run_disabled_tests";
  82 const char kBreakOnFailureFlag[] = "break_on_failure";
  83 const char kCatchExceptionsFlag[] = "catch_exceptions";
  84 const char kColorFlag[] = "color";
  85 const char kFilterFlag[] = "filter";
  86 const char kListTestsFlag[] = "list_tests";
  87 const char kOutputFlag[] = "output";
  88 const char kPrintTimeFlag[] = "print_time";
  89 const char kPrintUTF8Flag[] = "print_utf8";
  90 const char kRandomSeedFlag[] = "random_seed";
  91 const char kRepeatFlag[] = "repeat";
  92 const char kShuffleFlag[] = "shuffle";
  93 const char kStackTraceDepthFlag[] = "stack_trace_depth";
  94 const char kStreamResultToFlag[] = "stream_result_to";
  95 const char kThrowOnFailureFlag[] = "throw_on_failure";
  96 const char kFlagfileFlag[] = "flagfile";
  97 
  98 // A valid random seed must be in [1, kMaxRandomSeed].
  99 const int kMaxRandomSeed = 99999;
 100 
 101 // g_help_flag is true iff the --help flag or an equivalent form is
 102 // specified on the command line.
 103 GTEST_API_ extern bool g_help_flag;
 104 
 105 // Returns the current time in milliseconds.
 106 GTEST_API_ TimeInMillis GetTimeInMillis();
 107 
 108 // Returns true iff Google Test should use colors in the output.
 109 GTEST_API_ bool ShouldUseColor(bool stdout_is_tty);
 110 
 111 // Formats the given time in milliseconds as seconds.
 112 GTEST_API_ std::string FormatTimeInMillisAsSeconds(TimeInMillis ms);
 113 
 114 // Converts the given time in milliseconds to a date string in the ISO 8601
 115 // format, without the timezone information.  N.B.: due to the use the
 116 // non-reentrant localtime() function, this function is not thread safe.  Do
 117 // not use it in any code that can be called from multiple threads.
 118 GTEST_API_ std::string FormatEpochTimeInMillisAsIso8601(TimeInMillis ms);
 119 
 120 // Parses a string for an Int32 flag, in the form of "--flag=value".
 121 //
 122 // On success, stores the value of the flag in *value, and returns
 123 // true.  On failure, returns false without changing *value.
 124 GTEST_API_ bool ParseInt32Flag(
 125     const char* str, const char* flag, Int32* value);
 126 
 127 // Returns a random seed in range [1, kMaxRandomSeed] based on the
 128 // given --gtest_random_seed flag value.
 129 inline int GetRandomSeedFromFlag(Int32 random_seed_flag) {
 130   const unsigned int raw_seed = (random_seed_flag == 0) ?
 131       static_cast<unsigned int>(GetTimeInMillis()) :
 132       static_cast<unsigned int>(random_seed_flag);
 133 
 134   // Normalizes the actual seed to range [1, kMaxRandomSeed] such that
 135   // it's easy to type.
 136   const int normalized_seed =
 137       static_cast<int>((raw_seed - 1U) %
 138                        static_cast<unsigned int>(kMaxRandomSeed)) + 1;
 139   return normalized_seed;
 140 }
 141 
 142 // Returns the first valid random seed after 'seed'.  The behavior is
 143 // undefined if 'seed' is invalid.  The seed after kMaxRandomSeed is
 144 // considered to be 1.
 145 inline int GetNextRandomSeed(int seed) {
 146   GTEST_CHECK_(1 <= seed && seed <= kMaxRandomSeed)
 147       << "Invalid random seed " << seed << " - must be in [1, "
 148       << kMaxRandomSeed << "].";
 149   const int next_seed = seed + 1;
 150   return (next_seed > kMaxRandomSeed) ? 1 : next_seed;
 151 }
 152 
 153 // This class saves the values of all Google Test flags in its c'tor, and
 154 // restores them in its d'tor.
 155 class GTestFlagSaver {
 156  public:
 157   // The c'tor.
 158   GTestFlagSaver() {
 159     also_run_disabled_tests_ = GTEST_FLAG(also_run_disabled_tests);
 160     break_on_failure_ = GTEST_FLAG(break_on_failure);
 161     catch_exceptions_ = GTEST_FLAG(catch_exceptions);
 162     color_ = GTEST_FLAG(color);
 163     death_test_style_ = GTEST_FLAG(death_test_style);
 164     death_test_use_fork_ = GTEST_FLAG(death_test_use_fork);
 165     filter_ = GTEST_FLAG(filter);
 166     internal_run_death_test_ = GTEST_FLAG(internal_run_death_test);
 167     list_tests_ = GTEST_FLAG(list_tests);
 168     output_ = GTEST_FLAG(output);
 169     print_time_ = GTEST_FLAG(print_time);
 170     print_utf8_ = GTEST_FLAG(print_utf8);
 171     random_seed_ = GTEST_FLAG(random_seed);
 172     repeat_ = GTEST_FLAG(repeat);
 173     shuffle_ = GTEST_FLAG(shuffle);
 174     stack_trace_depth_ = GTEST_FLAG(stack_trace_depth);
 175     stream_result_to_ = GTEST_FLAG(stream_result_to);
 176     throw_on_failure_ = GTEST_FLAG(throw_on_failure);
 177   }
 178 
 179   // The d'tor is not virtual.  DO NOT INHERIT FROM THIS CLASS.
 180   ~GTestFlagSaver() {
 181     GTEST_FLAG(also_run_disabled_tests) = also_run_disabled_tests_;
 182     GTEST_FLAG(break_on_failure) = break_on_failure_;
 183     GTEST_FLAG(catch_exceptions) = catch_exceptions_;
 184     GTEST_FLAG(color) = color_;
 185     GTEST_FLAG(death_test_style) = death_test_style_;
 186     GTEST_FLAG(death_test_use_fork) = death_test_use_fork_;
 187     GTEST_FLAG(filter) = filter_;
 188     GTEST_FLAG(internal_run_death_test) = internal_run_death_test_;
 189     GTEST_FLAG(list_tests) = list_tests_;
 190     GTEST_FLAG(output) = output_;
 191     GTEST_FLAG(print_time) = print_time_;
 192     GTEST_FLAG(print_utf8) = print_utf8_;
 193     GTEST_FLAG(random_seed) = random_seed_;
 194     GTEST_FLAG(repeat) = repeat_;
 195     GTEST_FLAG(shuffle) = shuffle_;
 196     GTEST_FLAG(stack_trace_depth) = stack_trace_depth_;
 197     GTEST_FLAG(stream_result_to) = stream_result_to_;
 198     GTEST_FLAG(throw_on_failure) = throw_on_failure_;
 199   }
 200 
 201  private:
 202   // Fields for saving the original values of flags.
 203   bool also_run_disabled_tests_;
 204   bool break_on_failure_;
 205   bool catch_exceptions_;
 206   std::string color_;
 207   std::string death_test_style_;
 208   bool death_test_use_fork_;
 209   std::string filter_;
 210   std::string internal_run_death_test_;
 211   bool list_tests_;
 212   std::string output_;
 213   bool print_time_;
 214   bool print_utf8_;
 215   internal::Int32 random_seed_;
 216   internal::Int32 repeat_;
 217   bool shuffle_;
 218   internal::Int32 stack_trace_depth_;
 219   std::string stream_result_to_;
 220   bool throw_on_failure_;
 221 } GTEST_ATTRIBUTE_UNUSED_;
 222 
 223 // Converts a Unicode code point to a narrow string in UTF-8 encoding.
 224 // code_point parameter is of type UInt32 because wchar_t may not be
 225 // wide enough to contain a code point.
 226 // If the code_point is not a valid Unicode code point
 227 // (i.e. outside of Unicode range U+0 to U+10FFFF) it will be converted
 228 // to "(Invalid Unicode 0xXXXXXXXX)".
 229 GTEST_API_ std::string CodePointToUtf8(UInt32 code_point);
 230 
 231 // Converts a wide string to a narrow string in UTF-8 encoding.
 232 // The wide string is assumed to have the following encoding:
 233 //   UTF-16 if sizeof(wchar_t) == 2 (on Windows, Cygwin, Symbian OS)
 234 //   UTF-32 if sizeof(wchar_t) == 4 (on Linux)
 235 // Parameter str points to a null-terminated wide string.
 236 // Parameter num_chars may additionally limit the number
 237 // of wchar_t characters processed. -1 is used when the entire string
 238 // should be processed.
 239 // If the string contains code points that are not valid Unicode code points
 240 // (i.e. outside of Unicode range U+0 to U+10FFFF) they will be output
 241 // as '(Invalid Unicode 0xXXXXXXXX)'. If the string is in UTF16 encoding
 242 // and contains invalid UTF-16 surrogate pairs, values in those pairs
 243 // will be encoded as individual Unicode characters from Basic Normal Plane.
 244 GTEST_API_ std::string WideStringToUtf8(const wchar_t* str, int num_chars);
 245 
 246 // Reads the GTEST_SHARD_STATUS_FILE environment variable, and creates the file
 247 // if the variable is present. If a file already exists at this location, this
 248 // function will write over it. If the variable is present, but the file cannot
 249 // be created, prints an error and exits.
 250 void WriteToShardStatusFileIfNeeded();
 251 
 252 // Checks whether sharding is enabled by examining the relevant
 253 // environment variable values. If the variables are present,
 254 // but inconsistent (e.g., shard_index >= total_shards), prints
 255 // an error and exits. If in_subprocess_for_death_test, sharding is
 256 // disabled because it must only be applied to the original test
 257 // process. Otherwise, we could filter out death tests we intended to execute.
 258 GTEST_API_ bool ShouldShard(const char* total_shards_str,
 259                             const char* shard_index_str,
 260                             bool in_subprocess_for_death_test);
 261 
 262 // Parses the environment variable var as an Int32. If it is unset,
 263 // returns default_val. If it is not an Int32, prints an error and
 264 // and aborts.
 265 GTEST_API_ Int32 Int32FromEnvOrDie(const char* env_var, Int32 default_val);
 266 
 267 // Given the total number of shards, the shard index, and the test id,
 268 // returns true iff the test should be run on this shard. The test id is
 269 // some arbitrary but unique non-negative integer assigned to each test
 270 // method. Assumes that 0 <= shard_index < total_shards.
 271 GTEST_API_ bool ShouldRunTestOnShard(
 272     int total_shards, int shard_index, int test_id);
 273 
 274 // STL container utilities.
 275 
 276 // Returns the number of elements in the given container that satisfy
 277 // the given predicate.
 278 template <class Container, typename Predicate>
 279 inline int CountIf(const Container& c, Predicate predicate) {
 280   // Implemented as an explicit loop since std::count_if() in libCstd on
 281   // Solaris has a non-standard signature.
 282   int count = 0;
 283   for (typename Container::const_iterator it = c.begin(); it != c.end(); ++it) {
 284     if (predicate(*it))
 285       ++count;
 286   }
 287   return count;
 288 }
 289 
 290 // Applies a function/functor to each element in the container.
 291 template <class Container, typename Functor>
 292 void ForEach(const Container& c, Functor functor) {
 293   std::for_each(c.begin(), c.end(), functor);
 294 }
 295 
 296 // Returns the i-th element of the vector, or default_value if i is not
 297 // in range [0, v.size()).
 298 template <typename E>
 299 inline E GetElementOr(const std::vector<E>& v, int i, E default_value) {
 300   return (i < 0 || i >= static_cast<int>(v.size())) ? default_value : v[i];
 301 }
 302 
 303 // Performs an in-place shuffle of a range of the vector's elements.
 304 // 'begin' and 'end' are element indices as an STL-style range;
 305 // i.e. [begin, end) are shuffled, where 'end' == size() means to
 306 // shuffle to the end of the vector.
 307 template <typename E>
 308 void ShuffleRange(internal::Random* random, int begin, int end,
 309                   std::vector<E>* v) {
 310   const int size = static_cast<int>(v->size());
 311   GTEST_CHECK_(0 <= begin && begin <= size)
 312       << "Invalid shuffle range start " << begin << ": must be in range [0, "
 313       << size << "].";
 314   GTEST_CHECK_(begin <= end && end <= size)
 315       << "Invalid shuffle range finish " << end << ": must be in range ["
 316       << begin << ", " << size << "].";
 317 
 318   // Fisher-Yates shuffle, from
 319   // http://en.wikipedia.org/wiki/Fisher-Yates_shuffle
 320   for (int range_width = end - begin; range_width >= 2; range_width--) {
 321     const int last_in_range = begin + range_width - 1;
 322     const int selected = begin + random->Generate(range_width);
 323     std::swap((*v)[selected], (*v)[last_in_range]);
 324   }
 325 }
 326 
 327 // Performs an in-place shuffle of the vector's elements.
 328 template <typename E>
 329 inline void Shuffle(internal::Random* random, std::vector<E>* v) {
 330   ShuffleRange(random, 0, static_cast<int>(v->size()), v);
 331 }
 332 
 333 // A function for deleting an object.  Handy for being used as a
 334 // functor.
 335 template <typename T>
 336 static void Delete(T* x) {
 337   delete x;
 338 }
 339 
 340 // A predicate that checks the key of a TestProperty against a known key.
 341 //
 342 // TestPropertyKeyIs is copyable.
 343 class TestPropertyKeyIs {
 344  public:
 345   // Constructor.
 346   //
 347   // TestPropertyKeyIs has NO default constructor.
 348   explicit TestPropertyKeyIs(const std::string& key) : key_(key) {}
 349 
 350   // Returns true iff the test name of test property matches on key_.
 351   bool operator()(const TestProperty& test_property) const {
 352     return test_property.key() == key_;
 353   }
 354 
 355  private:
 356   std::string key_;
 357 };
 358 
 359 // Class UnitTestOptions.
 360 //
 361 // This class contains functions for processing options the user
 362 // specifies when running the tests.  It has only static members.
 363 //
 364 // In most cases, the user can specify an option using either an
 365 // environment variable or a command line flag.  E.g. you can set the
 366 // test filter using either GTEST_FILTER or --gtest_filter.  If both
 367 // the variable and the flag are present, the latter overrides the
 368 // former.
 369 class GTEST_API_ UnitTestOptions {
 370  public:
 371   // Functions for processing the gtest_output flag.
 372 
 373   // Returns the output format, or "" for normal printed output.
 374   static std::string GetOutputFormat();
 375 
 376   // Returns the absolute path of the requested output file, or the
 377   // default (test_detail.xml in the original working directory) if
 378   // none was explicitly specified.
 379   static std::string GetAbsolutePathToOutputFile();
 380 
 381   // Functions for processing the gtest_filter flag.
 382 
 383   // Returns true iff the wildcard pattern matches the string.  The
 384   // first ':' or '\0' character in pattern marks the end of it.
 385   //
 386   // This recursive algorithm isn't very efficient, but is clear and
 387   // works well enough for matching test names, which are short.
 388   static bool PatternMatchesString(const char *pattern, const char *str);
 389 
 390   // Returns true iff the user-specified filter matches the test case
 391   // name and the test name.
 392   static bool FilterMatchesTest(const std::string &test_case_name,
 393                                 const std::string &test_name);
 394 
 395 #if GTEST_OS_WINDOWS
 396   // Function for supporting the gtest_catch_exception flag.
 397 
 398   // Returns EXCEPTION_EXECUTE_HANDLER if Google Test should handle the
 399   // given SEH exception, or EXCEPTION_CONTINUE_SEARCH otherwise.
 400   // This function is useful as an __except condition.
 401   static int GTestShouldProcessSEH(DWORD exception_code);
 402 #endif  // GTEST_OS_WINDOWS
 403 
 404   // Returns true if "name" matches the ':' separated list of glob-style
 405   // filters in "filter".
 406   static bool MatchesFilter(const std::string& name, const char* filter);
 407 };
 408 
 409 // Returns the current application's name, removing directory path if that
 410 // is present.  Used by UnitTestOptions::GetOutputFile.
 411 GTEST_API_ FilePath GetCurrentExecutableName();
 412 
 413 // The role interface for getting the OS stack trace as a string.
 414 class OsStackTraceGetterInterface {
 415  public:
 416   OsStackTraceGetterInterface() {}
 417   virtual ~OsStackTraceGetterInterface() {}
 418 
 419   // Returns the current OS stack trace as an std::string.  Parameters:
 420   //
 421   //   max_depth  - the maximum number of stack frames to be included
 422   //                in the trace.
 423   //   skip_count - the number of top frames to be skipped; doesn't count
 424   //                against max_depth.
 425   virtual std::string CurrentStackTrace(int max_depth, int skip_count) = 0;
 426 
 427   // UponLeavingGTest() should be called immediately before Google Test calls
 428   // user code. It saves some information about the current stack that
 429   // CurrentStackTrace() will use to find and hide Google Test stack frames.
 430   virtual void UponLeavingGTest() = 0;
 431 
 432   // This string is inserted in place of stack frames that are part of
 433   // Google Test's implementation.
 434   static const char* const kElidedFramesMarker;
 435 
 436  private:
 437   GTEST_DISALLOW_COPY_AND_ASSIGN_(OsStackTraceGetterInterface);
 438 };
 439 
 440 // A working implementation of the OsStackTraceGetterInterface interface.
 441 class OsStackTraceGetter : public OsStackTraceGetterInterface {
 442  public:
 443   OsStackTraceGetter() {}
 444 
 445   virtual std::string CurrentStackTrace(int max_depth, int skip_count);
 446   virtual void UponLeavingGTest();
 447 
 448  private:
 449 #if GTEST_HAS_ABSL
 450   Mutex mutex_;  // Protects all internal state.
 451 
 452   // We save the stack frame below the frame that calls user code.
 453   // We do this because the address of the frame immediately below
 454   // the user code changes between the call to UponLeavingGTest()
 455   // and any calls to the stack trace code from within the user code.
 456   void* caller_frame_ = nullptr;
 457 #endif  // GTEST_HAS_ABSL
 458 
 459   GTEST_DISALLOW_COPY_AND_ASSIGN_(OsStackTraceGetter);
 460 };
 461 
 462 // Information about a Google Test trace point.
 463 struct TraceInfo {
 464   const char* file;
 465   int line;
 466   std::string message;
 467 };
 468 
 469 // This is the default global test part result reporter used in UnitTestImpl.
 470 // This class should only be used by UnitTestImpl.
 471 class DefaultGlobalTestPartResultReporter
 472   : public TestPartResultReporterInterface {
 473  public:
 474   explicit DefaultGlobalTestPartResultReporter(UnitTestImpl* unit_test);
 475   // Implements the TestPartResultReporterInterface. Reports the test part
 476   // result in the current test.
 477   virtual void ReportTestPartResult(const TestPartResult& result);
 478 
 479  private:
 480   UnitTestImpl* const unit_test_;
 481 
 482   GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultGlobalTestPartResultReporter);
 483 };
 484 
 485 // This is the default per thread test part result reporter used in
 486 // UnitTestImpl. This class should only be used by UnitTestImpl.
 487 class DefaultPerThreadTestPartResultReporter
 488     : public TestPartResultReporterInterface {
 489  public:
 490   explicit DefaultPerThreadTestPartResultReporter(UnitTestImpl* unit_test);
 491   // Implements the TestPartResultReporterInterface. The implementation just
 492   // delegates to the current global test part result reporter of *unit_test_.
 493   virtual void ReportTestPartResult(const TestPartResult& result);
 494 
 495  private:
 496   UnitTestImpl* const unit_test_;
 497 
 498   GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultPerThreadTestPartResultReporter);
 499 };
 500 
 501 // The private implementation of the UnitTest class.  We don't protect
 502 // the methods under a mutex, as this class is not accessible by a
 503 // user and the UnitTest class that delegates work to this class does
 504 // proper locking.
 505 class GTEST_API_ UnitTestImpl {
 506  public:
 507   explicit UnitTestImpl(UnitTest* parent);
 508   virtual ~UnitTestImpl();
 509 
 510   // There are two different ways to register your own TestPartResultReporter.
 511   // You can register your own repoter to listen either only for test results
 512   // from the current thread or for results from all threads.
 513   // By default, each per-thread test result repoter just passes a new
 514   // TestPartResult to the global test result reporter, which registers the
 515   // test part result for the currently running test.
 516 
 517   // Returns the global test part result reporter.
 518   TestPartResultReporterInterface* GetGlobalTestPartResultReporter();
 519 
 520   // Sets the global test part result reporter.
 521   void SetGlobalTestPartResultReporter(
 522       TestPartResultReporterInterface* reporter);
 523 
 524   // Returns the test part result reporter for the current thread.
 525   TestPartResultReporterInterface* GetTestPartResultReporterForCurrentThread();
 526 
 527   // Sets the test part result reporter for the current thread.
 528   void SetTestPartResultReporterForCurrentThread(
 529       TestPartResultReporterInterface* reporter);
 530 
 531   // Gets the number of successful test cases.
 532   int successful_test_case_count() const;
 533 
 534   // Gets the number of failed test cases.
 535   int failed_test_case_count() const;
 536 
 537   // Gets the number of all test cases.
 538   int total_test_case_count() const;
 539 
 540   // Gets the number of all test cases that contain at least one test
 541   // that should run.
 542   int test_case_to_run_count() const;
 543 
 544   // Gets the number of successful tests.
 545   int successful_test_count() const;
 546 
 547   // Gets the number of failed tests.
 548   int failed_test_count() const;
 549 
 550   // Gets the number of disabled tests that will be reported in the XML report.
 551   int reportable_disabled_test_count() const;
 552 
 553   // Gets the number of disabled tests.
 554   int disabled_test_count() const;
 555 
 556   // Gets the number of tests to be printed in the XML report.
 557   int reportable_test_count() const;
 558 
 559   // Gets the number of all tests.
 560   int total_test_count() const;
 561 
 562   // Gets the number of tests that should run.
 563   int test_to_run_count() const;
 564 
 565   // Gets the time of the test program start, in ms from the start of the
 566   // UNIX epoch.
 567   TimeInMillis start_timestamp() const { return start_timestamp_; }
 568 
 569   // Gets the elapsed time, in milliseconds.
 570   TimeInMillis elapsed_time() const { return elapsed_time_; }
 571 
 572   // Returns true iff the unit test passed (i.e. all test cases passed).
 573   bool Passed() const { return !Failed(); }
 574 
 575   // Returns true iff the unit test failed (i.e. some test case failed
 576   // or something outside of all tests failed).
 577   bool Failed() const {
 578     return failed_test_case_count() > 0 || ad_hoc_test_result()->Failed();
 579   }
 580 
 581   // Gets the i-th test case among all the test cases. i can range from 0 to
 582   // total_test_case_count() - 1. If i is not in that range, returns NULL.
 583   const TestCase* GetTestCase(int i) const {
 584     const int index = GetElementOr(test_case_indices_, i, -1);
 585     return index < 0 ? NULL : test_cases_[i];
 586   }
 587 
 588   // Gets the i-th test case among all the test cases. i can range from 0 to
 589   // total_test_case_count() - 1. If i is not in that range, returns NULL.
 590   TestCase* GetMutableTestCase(int i) {
 591     const int index = GetElementOr(test_case_indices_, i, -1);
 592     return index < 0 ? NULL : test_cases_[index];
 593   }
 594 
 595   // Provides access to the event listener list.
 596   TestEventListeners* listeners() { return &listeners_; }
 597 
 598   // Returns the TestResult for the test that's currently running, or
 599   // the TestResult for the ad hoc test if no test is running.
 600   TestResult* current_test_result();
 601 
 602   // Returns the TestResult for the ad hoc test.
 603   const TestResult* ad_hoc_test_result() const { return &ad_hoc_test_result_; }
 604 
 605   // Sets the OS stack trace getter.
 606   //
 607   // Does nothing if the input and the current OS stack trace getter
 608   // are the same; otherwise, deletes the old getter and makes the
 609   // input the current getter.
 610   void set_os_stack_trace_getter(OsStackTraceGetterInterface* getter);
 611 
 612   // Returns the current OS stack trace getter if it is not NULL;
 613   // otherwise, creates an OsStackTraceGetter, makes it the current
 614   // getter, and returns it.
 615   OsStackTraceGetterInterface* os_stack_trace_getter();
 616 
 617   // Returns the current OS stack trace as an std::string.
 618   //
 619   // The maximum number of stack frames to be included is specified by
 620   // the gtest_stack_trace_depth flag.  The skip_count parameter
 621   // specifies the number of top frames to be skipped, which doesn't
 622   // count against the number of frames to be included.
 623   //
 624   // For example, if Foo() calls Bar(), which in turn calls
 625   // CurrentOsStackTraceExceptTop(1), Foo() will be included in the
 626   // trace but Bar() and CurrentOsStackTraceExceptTop() won't.
 627   std::string CurrentOsStackTraceExceptTop(int skip_count) GTEST_NO_INLINE_;
 628 
 629   // Finds and returns a TestCase with the given name.  If one doesn't
 630   // exist, creates one and returns it.
 631   //
 632   // Arguments:
 633   //
 634   //   test_case_name: name of the test case
 635   //   type_param:     the name of the test's type parameter, or NULL if
 636   //                   this is not a typed or a type-parameterized test.
 637   //   set_up_tc:      pointer to the function that sets up the test case
 638   //   tear_down_tc:   pointer to the function that tears down the test case
 639   TestCase* GetTestCase(const char* test_case_name,
 640                         const char* type_param,
 641                         Test::SetUpTestCaseFunc set_up_tc,
 642                         Test::TearDownTestCaseFunc tear_down_tc);
 643 
 644   // Adds a TestInfo to the unit test.
 645   //
 646   // Arguments:
 647   //
 648   //   set_up_tc:    pointer to the function that sets up the test case
 649   //   tear_down_tc: pointer to the function that tears down the test case
 650   //   test_info:    the TestInfo object
 651   void AddTestInfo(Test::SetUpTestCaseFunc set_up_tc,
 652                    Test::TearDownTestCaseFunc tear_down_tc,
 653                    TestInfo* test_info) {
 654     // In order to support thread-safe death tests, we need to
 655     // remember the original working directory when the test program
 656     // was first invoked.  We cannot do this in RUN_ALL_TESTS(), as
 657     // the user may have changed the current directory before calling
 658     // RUN_ALL_TESTS().  Therefore we capture the current directory in
 659     // AddTestInfo(), which is called to register a TEST or TEST_F
 660     // before main() is reached.
 661     if (original_working_dir_.IsEmpty()) {
 662       original_working_dir_.Set(FilePath::GetCurrentDir());
 663       GTEST_CHECK_(!original_working_dir_.IsEmpty())
 664           << "Failed to get the current working directory.";
 665     }
 666 
 667     GetTestCase(test_info->test_case_name(),
 668                 test_info->type_param(),
 669                 set_up_tc,
 670                 tear_down_tc)->AddTestInfo(test_info);
 671   }
 672 
 673   // Returns ParameterizedTestCaseRegistry object used to keep track of
 674   // value-parameterized tests and instantiate and register them.
 675   internal::ParameterizedTestCaseRegistry& parameterized_test_registry() {
 676     return parameterized_test_registry_;
 677   }
 678 
 679   // Sets the TestCase object for the test that's currently running.
 680   void set_current_test_case(TestCase* a_current_test_case) {
 681     current_test_case_ = a_current_test_case;
 682   }
 683 
 684   // Sets the TestInfo object for the test that's currently running.  If
 685   // current_test_info is NULL, the assertion results will be stored in
 686   // ad_hoc_test_result_.
 687   void set_current_test_info(TestInfo* a_current_test_info) {
 688     current_test_info_ = a_current_test_info;
 689   }
 690 
 691   // Registers all parameterized tests defined using TEST_P and
 692   // INSTANTIATE_TEST_CASE_P, creating regular tests for each test/parameter
 693   // combination. This method can be called more then once; it has guards
 694   // protecting from registering the tests more then once.  If
 695   // value-parameterized tests are disabled, RegisterParameterizedTests is
 696   // present but does nothing.
 697   void RegisterParameterizedTests();
 698 
 699   // Runs all tests in this UnitTest object, prints the result, and
 700   // returns true if all tests are successful.  If any exception is
 701   // thrown during a test, this test is considered to be failed, but
 702   // the rest of the tests will still be run.
 703   bool RunAllTests();
 704 
 705   // Clears the results of all tests, except the ad hoc tests.
 706   void ClearNonAdHocTestResult() {
 707     ForEach(test_cases_, TestCase::ClearTestCaseResult);
 708   }
 709 
 710   // Clears the results of ad-hoc test assertions.
 711   void ClearAdHocTestResult() {
 712     ad_hoc_test_result_.Clear();
 713   }
 714 
 715   // Adds a TestProperty to the current TestResult object when invoked in a
 716   // context of a test or a test case, or to the global property set. If the
 717   // result already contains a property with the same key, the value will be
 718   // updated.
 719   void RecordProperty(const TestProperty& test_property);
 720 
 721   enum ReactionToSharding {
 722     HONOR_SHARDING_PROTOCOL,
 723     IGNORE_SHARDING_PROTOCOL
 724   };
 725 
 726   // Matches the full name of each test against the user-specified
 727   // filter to decide whether the test should run, then records the
 728   // result in each TestCase and TestInfo object.
 729   // If shard_tests == HONOR_SHARDING_PROTOCOL, further filters tests
 730   // based on sharding variables in the environment.
 731   // Returns the number of tests that should run.
 732   int FilterTests(ReactionToSharding shard_tests);
 733 
 734   // Prints the names of the tests matching the user-specified filter flag.
 735   void ListTestsMatchingFilter();
 736 
 737   const TestCase* current_test_case() const { return current_test_case_; }
 738   TestInfo* current_test_info() { return current_test_info_; }
 739   const TestInfo* current_test_info() const { return current_test_info_; }
 740 
 741   // Returns the vector of environments that need to be set-up/torn-down
 742   // before/after the tests are run.
 743   std::vector<Environment*>& environments() { return environments_; }
 744 
 745   // Getters for the per-thread Google Test trace stack.
 746   std::vector<TraceInfo>& gtest_trace_stack() {
 747     return *(gtest_trace_stack_.pointer());
 748   }
 749   const std::vector<TraceInfo>& gtest_trace_stack() const {
 750     return gtest_trace_stack_.get();
 751   }
 752 
 753 #if GTEST_HAS_DEATH_TEST
 754   void InitDeathTestSubprocessControlInfo() {
 755     internal_run_death_test_flag_.reset(ParseInternalRunDeathTestFlag());
 756   }
 757   // Returns a pointer to the parsed --gtest_internal_run_death_test
 758   // flag, or NULL if that flag was not specified.
 759   // This information is useful only in a death test child process.
 760   // Must not be called before a call to InitGoogleTest.
 761   const InternalRunDeathTestFlag* internal_run_death_test_flag() const {
 762     return internal_run_death_test_flag_.get();
 763   }
 764 
 765   // Returns a pointer to the current death test factory.
 766   internal::DeathTestFactory* death_test_factory() {
 767     return death_test_factory_.get();
 768   }
 769 
 770   void SuppressTestEventsIfInSubprocess();
 771 
 772   friend class ReplaceDeathTestFactory;
 773 #endif  // GTEST_HAS_DEATH_TEST
 774 
 775   // Initializes the event listener performing XML output as specified by
 776   // UnitTestOptions. Must not be called before InitGoogleTest.
 777   void ConfigureXmlOutput();
 778 
 779 #if GTEST_CAN_STREAM_RESULTS_
 780   // Initializes the event listener for streaming test results to a socket.
 781   // Must not be called before InitGoogleTest.
 782   void ConfigureStreamingOutput();
 783 #endif
 784 
 785   // Performs initialization dependent upon flag values obtained in
 786   // ParseGoogleTestFlagsOnly.  Is called from InitGoogleTest after the call to
 787   // ParseGoogleTestFlagsOnly.  In case a user neglects to call InitGoogleTest
 788   // this function is also called from RunAllTests.  Since this function can be
 789   // called more than once, it has to be idempotent.
 790   void PostFlagParsingInit();
 791 
 792   // Gets the random seed used at the start of the current test iteration.
 793   int random_seed() const { return random_seed_; }
 794 
 795   // Gets the random number generator.
 796   internal::Random* random() { return &random_; }
 797 
 798   // Shuffles all test cases, and the tests within each test case,
 799   // making sure that death tests are still run first.
 800   void ShuffleTests();
 801 
 802   // Restores the test cases and tests to their order before the first shuffle.
 803   void UnshuffleTests();
 804 
 805   // Returns the value of GTEST_FLAG(catch_exceptions) at the moment
 806   // UnitTest::Run() starts.
 807   bool catch_exceptions() const { return catch_exceptions_; }
 808 
 809  private:
 810   friend class ::testing::UnitTest;
 811 
 812   // Used by UnitTest::Run() to capture the state of
 813   // GTEST_FLAG(catch_exceptions) at the moment it starts.
 814   void set_catch_exceptions(bool value) { catch_exceptions_ = value; }
 815 
 816   // The UnitTest object that owns this implementation object.
 817   UnitTest* const parent_;
 818 
 819   // The working directory when the first TEST() or TEST_F() was
 820   // executed.
 821   internal::FilePath original_working_dir_;
 822 
 823   // The default test part result reporters.
 824   DefaultGlobalTestPartResultReporter default_global_test_part_result_reporter_;
 825   DefaultPerThreadTestPartResultReporter
 826       default_per_thread_test_part_result_reporter_;
 827 
 828   // Points to (but doesn't own) the global test part result reporter.
 829   TestPartResultReporterInterface* global_test_part_result_repoter_;
 830 
 831   // Protects read and write access to global_test_part_result_reporter_.
 832   internal::Mutex global_test_part_result_reporter_mutex_;
 833 
 834   // Points to (but doesn't own) the per-thread test part result reporter.
 835   internal::ThreadLocal<TestPartResultReporterInterface*>
 836       per_thread_test_part_result_reporter_;
 837 
 838   // The vector of environments that need to be set-up/torn-down
 839   // before/after the tests are run.
 840   std::vector<Environment*> environments_;
 841 
 842   // The vector of TestCases in their original order.  It owns the
 843   // elements in the vector.
 844   std::vector<TestCase*> test_cases_;
 845 
 846   // Provides a level of indirection for the test case list to allow
 847   // easy shuffling and restoring the test case order.  The i-th
 848   // element of this vector is the index of the i-th test case in the
 849   // shuffled order.
 850   std::vector<int> test_case_indices_;
 851 
 852   // ParameterizedTestRegistry object used to register value-parameterized
 853   // tests.
 854   internal::ParameterizedTestCaseRegistry parameterized_test_registry_;
 855 
 856   // Indicates whether RegisterParameterizedTests() has been called already.
 857   bool parameterized_tests_registered_;
 858 
 859   // Index of the last death test case registered.  Initially -1.
 860   int last_death_test_case_;
 861 
 862   // This points to the TestCase for the currently running test.  It
 863   // changes as Google Test goes through one test case after another.
 864   // When no test is running, this is set to NULL and Google Test
 865   // stores assertion results in ad_hoc_test_result_.  Initially NULL.
 866   TestCase* current_test_case_;
 867 
 868   // This points to the TestInfo for the currently running test.  It
 869   // changes as Google Test goes through one test after another.  When
 870   // no test is running, this is set to NULL and Google Test stores
 871   // assertion results in ad_hoc_test_result_.  Initially NULL.
 872   TestInfo* current_test_info_;
 873 
 874   // Normally, a user only writes assertions inside a TEST or TEST_F,
 875   // or inside a function called by a TEST or TEST_F.  Since Google
 876   // Test keeps track of which test is current running, it can
 877   // associate such an assertion with the test it belongs to.
 878   //
 879   // If an assertion is encountered when no TEST or TEST_F is running,
 880   // Google Test attributes the assertion result to an imaginary "ad hoc"
 881   // test, and records the result in ad_hoc_test_result_.
 882   TestResult ad_hoc_test_result_;
 883 
 884   // The list of event listeners that can be used to track events inside
 885   // Google Test.
 886   TestEventListeners listeners_;
 887 
 888   // The OS stack trace getter.  Will be deleted when the UnitTest
 889   // object is destructed.  By default, an OsStackTraceGetter is used,
 890   // but the user can set this field to use a custom getter if that is
 891   // desired.
 892   OsStackTraceGetterInterface* os_stack_trace_getter_;
 893 
 894   // True iff PostFlagParsingInit() has been called.
 895   bool post_flag_parse_init_performed_;
 896 
 897   // The random number seed used at the beginning of the test run.
 898   int random_seed_;
 899 
 900   // Our random number generator.
 901   internal::Random random_;
 902 
 903   // The time of the test program start, in ms from the start of the
 904   // UNIX epoch.
 905   TimeInMillis start_timestamp_;
 906 
 907   // How long the test took to run, in milliseconds.
 908   TimeInMillis elapsed_time_;
 909 
 910 #if GTEST_HAS_DEATH_TEST
 911   // The decomposed components of the gtest_internal_run_death_test flag,
 912   // parsed when RUN_ALL_TESTS is called.
 913   internal::scoped_ptr<InternalRunDeathTestFlag> internal_run_death_test_flag_;
 914   internal::scoped_ptr<internal::DeathTestFactory> death_test_factory_;
 915 #endif  // GTEST_HAS_DEATH_TEST
 916 
 917   // A per-thread stack of traces created by the SCOPED_TRACE() macro.
 918   internal::ThreadLocal<std::vector<TraceInfo> > gtest_trace_stack_;
 919 
 920   // The value of GTEST_FLAG(catch_exceptions) at the moment RunAllTests()
 921   // starts.
 922   bool catch_exceptions_;
 923 
 924   GTEST_DISALLOW_COPY_AND_ASSIGN_(UnitTestImpl);
 925 };  // class UnitTestImpl
 926 
 927 // Convenience function for accessing the global UnitTest
 928 // implementation object.
 929 inline UnitTestImpl* GetUnitTestImpl() {
 930   return UnitTest::GetInstance()->impl();
 931 }
 932 
 933 #if GTEST_USES_SIMPLE_RE
 934 
 935 // Internal helper functions for implementing the simple regular
 936 // expression matcher.
 937 GTEST_API_ bool IsInSet(char ch, const char* str);
 938 GTEST_API_ bool IsAsciiDigit(char ch);
 939 GTEST_API_ bool IsAsciiPunct(char ch);
 940 GTEST_API_ bool IsRepeat(char ch);
 941 GTEST_API_ bool IsAsciiWhiteSpace(char ch);
 942 GTEST_API_ bool IsAsciiWordChar(char ch);
 943 GTEST_API_ bool IsValidEscape(char ch);
 944 GTEST_API_ bool AtomMatchesChar(bool escaped, char pattern, char ch);
 945 GTEST_API_ bool ValidateRegex(const char* regex);
 946 GTEST_API_ bool MatchRegexAtHead(const char* regex, const char* str);
 947 GTEST_API_ bool MatchRepetitionAndRegexAtHead(
 948     bool escaped, char ch, char repeat, const char* regex, const char* str);
 949 GTEST_API_ bool MatchRegexAnywhere(const char* regex, const char* str);
 950 
 951 #endif  // GTEST_USES_SIMPLE_RE
 952 
 953 // Parses the command line for Google Test flags, without initializing
 954 // other parts of Google Test.
 955 GTEST_API_ void ParseGoogleTestFlagsOnly(int* argc, char** argv);
 956 GTEST_API_ void ParseGoogleTestFlagsOnly(int* argc, wchar_t** argv);
 957 
 958 #if GTEST_HAS_DEATH_TEST
 959 
 960 // Returns the message describing the last system error, regardless of the
 961 // platform.
 962 GTEST_API_ std::string GetLastErrnoDescription();
 963 
 964 // Attempts to parse a string into a positive integer pointed to by the
 965 // number parameter.  Returns true if that is possible.
 966 // GTEST_HAS_DEATH_TEST implies that we have ::std::string, so we can use
 967 // it here.
 968 template <typename Integer>
 969 bool ParseNaturalNumber(const ::std::string& str, Integer* number) {
 970   // Fail fast if the given string does not begin with a digit;
 971   // this bypasses strtoXXX's "optional leading whitespace and plus
 972   // or minus sign" semantics, which are undesirable here.
 973   if (str.empty() || !IsDigit(str[0])) {
 974     return false;
 975   }
 976   errno = 0;
 977 
 978   char* end;
 979   // BiggestConvertible is the largest integer type that system-provided
 980   // string-to-number conversion routines can return.
 981 
 982 # if GTEST_OS_WINDOWS && !defined(__GNUC__)
 983 
 984   // MSVC and C++ Builder define __int64 instead of the standard long long.
 985   typedef unsigned __int64 BiggestConvertible;
 986   const BiggestConvertible parsed = _strtoui64(str.c_str(), &end, 10);
 987 
 988 # else
 989 
 990   typedef unsigned long long BiggestConvertible;  // NOLINT
 991   const BiggestConvertible parsed = strtoull(str.c_str(), &end, 10);
 992 
 993 # endif  // GTEST_OS_WINDOWS && !defined(__GNUC__)
 994 
 995   const bool parse_success = *end == '\0' && errno == 0;
 996 
 997   // FIXME: Convert this to compile time assertion when it is
 998   // available.
 999   GTEST_CHECK_(sizeof(Integer) <= sizeof(parsed));
1000 
1001   const Integer result = static_cast<Integer>(parsed);
1002   if (parse_success && static_cast<BiggestConvertible>(result) == parsed) {
1003     *number = result;
1004     return true;
1005   }
1006   return false;
1007 }
1008 #endif  // GTEST_HAS_DEATH_TEST
1009 
1010 // TestResult contains some private methods that should be hidden from
1011 // Google Test user but are required for testing. This class allow our tests
1012 // to access them.
1013 //
1014 // This class is supplied only for the purpose of testing Google Test's own
1015 // constructs. Do not use it in user tests, either directly or indirectly.
1016 class TestResultAccessor {
1017  public:
1018   static void RecordProperty(TestResult* test_result,
1019                              const std::string& xml_element,
1020                              const TestProperty& property) {
1021     test_result->RecordProperty(xml_element, property);
1022   }
1023 
1024   static void ClearTestPartResults(TestResult* test_result) {
1025     test_result->ClearTestPartResults();
1026   }
1027 
1028   static const std::vector<testing::TestPartResult>& test_part_results(
1029       const TestResult& test_result) {
1030     return test_result.test_part_results();
1031   }
1032 };
1033 
1034 #if GTEST_CAN_STREAM_RESULTS_
1035 
1036 // Streams test results to the given port on the given host machine.
1037 class StreamingListener : public EmptyTestEventListener {
1038  public:
1039   // Abstract base class for writing strings to a socket.
1040   class AbstractSocketWriter {
1041    public:
1042     virtual ~AbstractSocketWriter() {}
1043 
1044     // Sends a string to the socket.
1045     virtual void Send(const std::string& message) = 0;
1046 
1047     // Closes the socket.
1048     virtual void CloseConnection() {}
1049 
1050     // Sends a string and a newline to the socket.
1051     void SendLn(const std::string& message) { Send(message + "\n"); }
1052   };
1053 
1054   // Concrete class for actually writing strings to a socket.
1055   class SocketWriter : public AbstractSocketWriter {
1056    public:
1057     SocketWriter(const std::string& host, const std::string& port)
1058         : sockfd_(-1), host_name_(host), port_num_(port) {
1059       MakeConnection();
1060     }
1061 
1062     virtual ~SocketWriter() {
1063       if (sockfd_ != -1)
1064         CloseConnection();
1065     }
1066 
1067     // Sends a string to the socket.
1068     virtual void Send(const std::string& message) {
1069       GTEST_CHECK_(sockfd_ != -1)
1070           << "Send() can be called only when there is a connection.";
1071 
1072       const int len = static_cast<int>(message.length());
1073       if (write(sockfd_, message.c_str(), len) != len) {
1074         GTEST_LOG_(WARNING)
1075             << "stream_result_to: failed to stream to "
1076             << host_name_ << ":" << port_num_;
1077       }
1078     }
1079 
1080    private:
1081     // Creates a client socket and connects to the server.
1082     void MakeConnection();
1083 
1084     // Closes the socket.
1085     void CloseConnection() {
1086       GTEST_CHECK_(sockfd_ != -1)
1087           << "CloseConnection() can be called only when there is a connection.";
1088 
1089       close(sockfd_);
1090       sockfd_ = -1;
1091     }
1092 
1093     int sockfd_;  // socket file descriptor
1094     const std::string host_name_;
1095     const std::string port_num_;
1096 
1097     GTEST_DISALLOW_COPY_AND_ASSIGN_(SocketWriter);
1098   };  // class SocketWriter
1099 
1100   // Escapes '=', '&', '%', and '\n' characters in str as "%xx".
1101   static std::string UrlEncode(const char* str);
1102 
1103   StreamingListener(const std::string& host, const std::string& port)
1104       : socket_writer_(new SocketWriter(host, port)) {
1105     Start();
1106   }
1107 
1108   explicit StreamingListener(AbstractSocketWriter* socket_writer)
1109       : socket_writer_(socket_writer) { Start(); }
1110 
1111   void OnTestProgramStart(const UnitTest& /* unit_test */) {
1112     SendLn("event=TestProgramStart");
1113   }
1114 
1115   void OnTestProgramEnd(const UnitTest& unit_test) {
1116     // Note that Google Test current only report elapsed time for each
1117     // test iteration, not for the entire test program.
1118     SendLn("event=TestProgramEnd&passed=" + FormatBool(unit_test.Passed()));
1119 
1120     // Notify the streaming server to stop.
1121     socket_writer_->CloseConnection();
1122   }
1123 
1124   void OnTestIterationStart(const UnitTest& /* unit_test */, int iteration) {
1125     SendLn("event=TestIterationStart&iteration=" +
1126            StreamableToString(iteration));
1127   }
1128 
1129   void OnTestIterationEnd(const UnitTest& unit_test, int /* iteration */) {
1130     SendLn("event=TestIterationEnd&passed=" +
1131            FormatBool(unit_test.Passed()) + "&elapsed_time=" +
1132            StreamableToString(unit_test.elapsed_time()) + "ms");
1133   }
1134 
1135   void OnTestCaseStart(const TestCase& test_case) {
1136     SendLn(std::string("event=TestCaseStart&name=") + test_case.name());
1137   }
1138 
1139   void OnTestCaseEnd(const TestCase& test_case) {
1140     SendLn("event=TestCaseEnd&passed=" + FormatBool(test_case.Passed())
1141            + "&elapsed_time=" + StreamableToString(test_case.elapsed_time())
1142            + "ms");
1143   }
1144 
1145   void OnTestStart(const TestInfo& test_info) {
1146     SendLn(std::string("event=TestStart&name=") + test_info.name());
1147   }
1148 
1149   void OnTestEnd(const TestInfo& test_info) {
1150     SendLn("event=TestEnd&passed=" +
1151            FormatBool((test_info.result())->Passed()) +
1152            "&elapsed_time=" +
1153            StreamableToString((test_info.result())->elapsed_time()) + "ms");
1154   }
1155 
1156   void OnTestPartResult(const TestPartResult& test_part_result) {
1157     const char* file_name = test_part_result.file_name();
1158     if (file_name == NULL)
1159       file_name = "";
1160     SendLn("event=TestPartResult&file=" + UrlEncode(file_name) +
1161            "&line=" + StreamableToString(test_part_result.line_number()) +
1162            "&message=" + UrlEncode(test_part_result.message()));
1163   }
1164 
1165  private:
1166   // Sends the given message and a newline to the socket.
1167   void SendLn(const std::string& message) { socket_writer_->SendLn(message); }
1168 
1169   // Called at the start of streaming to notify the receiver what
1170   // protocol we are using.
1171   void Start() { SendLn("gtest_streaming_protocol_version=1.0"); }
1172 
1173   std::string FormatBool(bool value) { return value ? "1" : "0"; }
1174 
1175   const scoped_ptr<AbstractSocketWriter> socket_writer_;
1176 
1177   GTEST_DISALLOW_COPY_AND_ASSIGN_(StreamingListener);
1178 };  // class StreamingListener
1179 
1180 #endif  // GTEST_CAN_STREAM_RESULTS_
1181 
1182 }  // namespace internal
1183 }  // namespace testing
1184 
1185 GTEST_DISABLE_MSC_WARNINGS_POP_()  //  4251
1186 
1187 #endif  // GTEST_SRC_GTEST_INTERNAL_INL_H_