Blame src/googletest.h

Packit Service 9def5d
// Copyright (c) 2009, Google Inc.
Packit Service 9def5d
// All rights reserved.
Packit Service 9def5d
//
Packit Service 9def5d
// Redistribution and use in source and binary forms, with or without
Packit Service 9def5d
// modification, are permitted provided that the following conditions are
Packit Service 9def5d
// met:
Packit Service 9def5d
//
Packit Service 9def5d
//     * Redistributions of source code must retain the above copyright
Packit Service 9def5d
// notice, this list of conditions and the following disclaimer.
Packit Service 9def5d
//     * Redistributions in binary form must reproduce the above
Packit Service 9def5d
// copyright notice, this list of conditions and the following disclaimer
Packit Service 9def5d
// in the documentation and/or other materials provided with the
Packit Service 9def5d
// distribution.
Packit Service 9def5d
//     * Neither the name of Google Inc. nor the names of its
Packit Service 9def5d
// contributors may be used to endorse or promote products derived from
Packit Service 9def5d
// this software without specific prior written permission.
Packit Service 9def5d
//
Packit Service 9def5d
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
Packit Service 9def5d
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
Packit Service 9def5d
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
Packit Service 9def5d
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
Packit Service 9def5d
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
Packit Service 9def5d
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
Packit Service 9def5d
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
Packit Service 9def5d
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
Packit Service 9def5d
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
Packit Service 9def5d
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
Packit Service 9def5d
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Packit Service 9def5d
//
Packit Service 9def5d
// Author: Shinichiro Hamaji
Packit Service 9def5d
//   (based on googletest: http://code.google.com/p/googletest/)
Packit Service 9def5d
Packit Service 9def5d
#ifdef GOOGLETEST_H__
Packit Service 9def5d
#error You must not include this file twice.
Packit Service 9def5d
#endif
Packit Service 9def5d
#define GOOGLETEST_H__
Packit Service 9def5d
Packit Service 9def5d
#include "utilities.h"
Packit Service 9def5d
Packit Service 9def5d
#include <ctype.h>
Packit Service 9def5d
#include <setjmp.h>
Packit Service 9def5d
#include <time.h>
Packit Service 9def5d
Packit Service 9def5d
#include <map>
Packit Service 9def5d
#include <sstream>
Packit Service 9def5d
#include <string>
Packit Service 9def5d
#include <vector>
Packit Service 9def5d
Packit Service 9def5d
#include <stdio.h>
Packit Service 9def5d
#include <stdlib.h>
Packit Service 9def5d
Packit Service 9def5d
#include <sys/types.h>
Packit Service 9def5d
#include <sys/stat.h>
Packit Service 9def5d
#include <fcntl.h>
Packit Service 9def5d
#ifdef HAVE_UNISTD_H
Packit Service 9def5d
# include <unistd.h>
Packit Service 9def5d
#endif
Packit Service 9def5d
Packit Service 9def5d
#include "base/commandlineflags.h"
Packit Service 9def5d
Packit Service 9def5d
using std::map;
Packit Service 9def5d
using std::string;
Packit Service 9def5d
using std::vector;
Packit Service 9def5d
Packit Service 9def5d
_START_GOOGLE_NAMESPACE_
Packit Service 9def5d
Packit Service 9def5d
extern GOOGLE_GLOG_DLL_DECL void (*g_logging_fail_func)();
Packit Service 9def5d
Packit Service 9def5d
_END_GOOGLE_NAMESPACE_
Packit Service 9def5d
Packit Service 9def5d
#undef GOOGLE_GLOG_DLL_DECL
Packit Service 9def5d
#define GOOGLE_GLOG_DLL_DECL
Packit Service 9def5d
Packit Service 9def5d
static inline string GetTempDir() {
Packit Service 9def5d
#ifndef OS_WINDOWS
Packit Service 9def5d
  return "/tmp";
Packit Service 9def5d
#else
Packit Service 9def5d
  char tmp[MAX_PATH];
Packit Service 9def5d
  GetTempPathA(MAX_PATH, tmp);
Packit Service 9def5d
  return tmp;
Packit Service 9def5d
#endif
Packit Service 9def5d
}
Packit Service 9def5d
Packit Service 9def5d
#if defined(OS_WINDOWS) && defined(_MSC_VER) && !defined(TEST_SRC_DIR)
Packit Service 9def5d
// The test will run in glog/vsproject/<project name>
Packit Service 9def5d
// (e.g., glog/vsproject/logging_unittest).
Packit Service 9def5d
static const char TEST_SRC_DIR[] = "../..";
Packit Service 9def5d
#elif !defined(TEST_SRC_DIR)
Packit Service 9def5d
# warning TEST_SRC_DIR should be defined in config.h
Packit Service 9def5d
static const char TEST_SRC_DIR[] = ".";
Packit Service 9def5d
#endif
Packit Service 9def5d
Packit Service 9def5d
DEFINE_string(test_tmpdir, GetTempDir(), "Dir we use for temp files");
Packit Service 9def5d
DEFINE_string(test_srcdir, TEST_SRC_DIR,
Packit Service 9def5d
              "Source-dir root, needed to find glog_unittest_flagfile");
Packit Service 9def5d
DEFINE_bool(run_benchmark, false, "If true, run benchmarks");
Packit Service 9def5d
#ifdef NDEBUG
Packit Service 9def5d
DEFINE_int32(benchmark_iters, 100000000, "Number of iterations per benchmark");
Packit Service 9def5d
#else
Packit Service 9def5d
DEFINE_int32(benchmark_iters, 100000, "Number of iterations per benchmark");
Packit Service 9def5d
#endif
Packit Service 9def5d
Packit Service 9def5d
#ifdef HAVE_LIB_GTEST
Packit Service 9def5d
# include <gtest/gtest.h>
Packit Service 9def5d
// Use our ASSERT_DEATH implementation.
Packit Service 9def5d
# undef ASSERT_DEATH
Packit Service 9def5d
# undef ASSERT_DEBUG_DEATH
Packit Service 9def5d
using testing::InitGoogleTest;
Packit Service 9def5d
#else
Packit Service 9def5d
Packit Service 9def5d
_START_GOOGLE_NAMESPACE_
Packit Service 9def5d
Packit Service 9def5d
void InitGoogleTest(int*, char**) {}
Packit Service 9def5d
Packit Service 9def5d
// The following is some bare-bones testing infrastructure
Packit Service 9def5d
Packit Service 9def5d
#define EXPECT_TRUE(cond)                               \
Packit Service 9def5d
  do {                                                  \
Packit Service 9def5d
    if (!(cond)) {                                      \
Packit Service 9def5d
      fprintf(stderr, "Check failed: %s\n", #cond);     \
Packit Service 9def5d
      exit(1);                                          \
Packit Service 9def5d
    }                                                   \
Packit Service 9def5d
  } while (0)
Packit Service 9def5d
Packit Service 9def5d
#define EXPECT_FALSE(cond)  EXPECT_TRUE(!(cond))
Packit Service 9def5d
Packit Service 9def5d
#define EXPECT_OP(op, val1, val2)                                       \
Packit Service 9def5d
  do {                                                                  \
Packit Service 9def5d
    if (!((val1) op (val2))) {                                          \
Packit Service 9def5d
      fprintf(stderr, "Check failed: %s %s %s\n", #val1, #op, #val2);   \
Packit Service 9def5d
      exit(1);                                                          \
Packit Service 9def5d
    }                                                                   \
Packit Service 9def5d
  } while (0)
Packit Service 9def5d
Packit Service 9def5d
#define EXPECT_EQ(val1, val2)  EXPECT_OP(==, val1, val2)
Packit Service 9def5d
#define EXPECT_NE(val1, val2)  EXPECT_OP(!=, val1, val2)
Packit Service 9def5d
#define EXPECT_GT(val1, val2)  EXPECT_OP(>, val1, val2)
Packit Service 9def5d
#define EXPECT_LT(val1, val2)  EXPECT_OP(<, val1, val2)
Packit Service 9def5d
Packit Service 9def5d
#define EXPECT_NAN(arg)                                         \
Packit Service 9def5d
  do {                                                          \
Packit Service 9def5d
    if (!isnan(arg)) {                                          \
Packit Service 9def5d
      fprintf(stderr, "Check failed: isnan(%s)\n", #arg);       \
Packit Service 9def5d
      exit(1);                                                  \
Packit Service 9def5d
    }                                                           \
Packit Service 9def5d
  } while (0)
Packit Service 9def5d
Packit Service 9def5d
#define EXPECT_INF(arg)                                         \
Packit Service 9def5d
  do {                                                          \
Packit Service 9def5d
    if (!isinf(arg)) {                                          \
Packit Service 9def5d
      fprintf(stderr, "Check failed: isinf(%s)\n", #arg);       \
Packit Service 9def5d
      exit(1);                                                  \
Packit Service 9def5d
    }                                                           \
Packit Service 9def5d
  } while (0)
Packit Service 9def5d
Packit Service 9def5d
#define EXPECT_DOUBLE_EQ(val1, val2)                                    \
Packit Service 9def5d
  do {                                                                  \
Packit Service 9def5d
    if (((val1) < (val2) - 0.001 || (val1) > (val2) + 0.001)) {         \
Packit Service 9def5d
      fprintf(stderr, "Check failed: %s == %s\n", #val1, #val2);        \
Packit Service 9def5d
      exit(1);                                                          \
Packit Service 9def5d
    }                                                                   \
Packit Service 9def5d
  } while (0)
Packit Service 9def5d
Packit Service 9def5d
#define EXPECT_STREQ(val1, val2)                                        \
Packit Service 9def5d
  do {                                                                  \
Packit Service 9def5d
    if (strcmp((val1), (val2)) != 0) {                                  \
Packit Service 9def5d
      fprintf(stderr, "Check failed: streq(%s, %s)\n", #val1, #val2);   \
Packit Service 9def5d
      exit(1);                                                          \
Packit Service 9def5d
    }                                                                   \
Packit Service 9def5d
  } while (0)
Packit Service 9def5d
Packit Service 9def5d
vector<void (*)()> g_testlist;  // the tests to run
Packit Service 9def5d
Packit Service 9def5d
#define TEST(a, b)                                      \
Packit Service 9def5d
  struct Test_##a##_##b {                               \
Packit Service 9def5d
    Test_##a##_##b() { g_testlist.push_back(&Run;; }    \
Packit Service 9def5d
    static void Run() { FlagSaver fs; RunTest(); }      \
Packit Service 9def5d
    static void RunTest();                              \
Packit Service 9def5d
  };                                                    \
Packit Service 9def5d
  static Test_##a##_##b g_test_##a##_##b;               \
Packit Service 9def5d
  void Test_##a##_##b::RunTest()
Packit Service 9def5d
Packit Service 9def5d
Packit Service 9def5d
static inline int RUN_ALL_TESTS() {
Packit Service 9def5d
  vector<void (*)()>::const_iterator it;
Packit Service 9def5d
  for (it = g_testlist.begin(); it != g_testlist.end(); ++it) {
Packit Service 9def5d
    (*it)();
Packit Service 9def5d
  }
Packit Service 9def5d
  fprintf(stderr, "Passed %d tests\n\nPASS\n", (int)g_testlist.size());
Packit Service 9def5d
  return 0;
Packit Service 9def5d
}
Packit Service 9def5d
Packit Service 9def5d
_END_GOOGLE_NAMESPACE_
Packit Service 9def5d
Packit Service 9def5d
#endif  // ! HAVE_LIB_GTEST
Packit Service 9def5d
Packit Service 9def5d
_START_GOOGLE_NAMESPACE_
Packit Service 9def5d
Packit Service 9def5d
static bool g_called_abort;
Packit Service 9def5d
static jmp_buf g_jmp_buf;
Packit Service 9def5d
static inline void CalledAbort() {
Packit Service 9def5d
  g_called_abort = true;
Packit Service 9def5d
  longjmp(g_jmp_buf, 1);
Packit Service 9def5d
}
Packit Service 9def5d
Packit Service 9def5d
#ifdef OS_WINDOWS
Packit Service 9def5d
// TODO(hamaji): Death test somehow doesn't work in Windows.
Packit Service 9def5d
#define ASSERT_DEATH(fn, msg)
Packit Service 9def5d
#else
Packit Service 9def5d
#define ASSERT_DEATH(fn, msg)                                           \
Packit Service 9def5d
  do {                                                                  \
Packit Service 9def5d
    g_called_abort = false;                                             \
Packit Service 9def5d
    /* in logging.cc */                                                 \
Packit Service 9def5d
    void (*original_logging_fail_func)() = g_logging_fail_func;         \
Packit Service 9def5d
    g_logging_fail_func = &CalledAbort;                                 \
Packit Service 9def5d
    if (!setjmp(g_jmp_buf)) fn;                                         \
Packit Service 9def5d
    /* set back to their default */                                     \
Packit Service 9def5d
    g_logging_fail_func = original_logging_fail_func;                   \
Packit Service 9def5d
    if (!g_called_abort) {                                              \
Packit Service 9def5d
      fprintf(stderr, "Function didn't die (%s): %s\n", msg, #fn);      \
Packit Service 9def5d
      exit(1);                                                          \
Packit Service 9def5d
    }                                                                   \
Packit Service 9def5d
  } while (0)
Packit Service 9def5d
#endif
Packit Service 9def5d
Packit Service 9def5d
#ifdef NDEBUG
Packit Service 9def5d
#define ASSERT_DEBUG_DEATH(fn, msg)
Packit Service 9def5d
#else
Packit Service 9def5d
#define ASSERT_DEBUG_DEATH(fn, msg) ASSERT_DEATH(fn, msg)
Packit Service 9def5d
#endif  // NDEBUG
Packit Service 9def5d
Packit Service 9def5d
// Benchmark tools.
Packit Service 9def5d
Packit Service 9def5d
#define BENCHMARK(n) static BenchmarkRegisterer __benchmark_ ## n (#n, &n);
Packit Service 9def5d
Packit Service 9def5d
map<string, void (*)(int)> g_benchlist;  // the benchmarks to run
Packit Service 9def5d
Packit Service 9def5d
class BenchmarkRegisterer {
Packit Service 9def5d
 public:
Packit Service 9def5d
  BenchmarkRegisterer(const char* name, void (*function)(int iters)) {
Packit Service 9def5d
    EXPECT_TRUE(g_benchlist.insert(std::make_pair(name, function)).second);
Packit Service 9def5d
  }
Packit Service 9def5d
};
Packit Service 9def5d
Packit Service 9def5d
static inline void RunSpecifiedBenchmarks() {
Packit Service 9def5d
  if (!FLAGS_run_benchmark) {
Packit Service 9def5d
    return;
Packit Service 9def5d
  }
Packit Service 9def5d
Packit Service 9def5d
  int iter_cnt = FLAGS_benchmark_iters;
Packit Service 9def5d
  puts("Benchmark\tTime(ns)\tIterations");
Packit Service 9def5d
  for (map<string, void (*)(int)>::const_iterator iter = g_benchlist.begin();
Packit Service 9def5d
       iter != g_benchlist.end();
Packit Service 9def5d
       ++iter) {
Packit Service 9def5d
    clock_t start = clock();
Packit Service 9def5d
    iter->second(iter_cnt);
Packit Service 9def5d
    double elapsed_ns =
Packit Service 9def5d
        ((double)clock() - start) / CLOCKS_PER_SEC * 1000*1000*1000;
Packit Service 9def5d
    printf("%s\t%8.2lf\t%10d\n",
Packit Service 9def5d
           iter->first.c_str(), elapsed_ns / iter_cnt, iter_cnt);
Packit Service 9def5d
  }
Packit Service 9def5d
  puts("");
Packit Service 9def5d
}
Packit Service 9def5d
Packit Service 9def5d
// ----------------------------------------------------------------------
Packit Service 9def5d
// Golden file functions
Packit Service 9def5d
// ----------------------------------------------------------------------
Packit Service 9def5d
Packit Service 9def5d
class CapturedStream {
Packit Service 9def5d
 public:
Packit Service 9def5d
  CapturedStream(int fd, const string & filename) :
Packit Service 9def5d
    fd_(fd),
Packit Service 9def5d
    uncaptured_fd_(-1),
Packit Service 9def5d
    filename_(filename) {
Packit Service 9def5d
    Capture();
Packit Service 9def5d
  }
Packit Service 9def5d
Packit Service 9def5d
  ~CapturedStream() {
Packit Service 9def5d
    if (uncaptured_fd_ != -1) {
Packit Service 9def5d
      CHECK(close(uncaptured_fd_) != -1);
Packit Service 9def5d
    }
Packit Service 9def5d
  }
Packit Service 9def5d
Packit Service 9def5d
  // Start redirecting output to a file
Packit Service 9def5d
  void Capture() {
Packit Service 9def5d
    // Keep original stream for later
Packit Service 9def5d
    CHECK(uncaptured_fd_ == -1) << ", Stream " << fd_ << " already captured!";
Packit Service 9def5d
    uncaptured_fd_ = dup(fd_);
Packit Service 9def5d
    CHECK(uncaptured_fd_ != -1);
Packit Service 9def5d
Packit Service 9def5d
    // Open file to save stream to
Packit Service 9def5d
    int cap_fd = open(filename_.c_str(),
Packit Service 9def5d
                      O_CREAT | O_TRUNC | O_WRONLY,
Packit Service 9def5d
                      S_IRUSR | S_IWUSR);
Packit Service 9def5d
    CHECK(cap_fd != -1);
Packit Service 9def5d
Packit Service 9def5d
    // Send stdout/stderr to this file
Packit Service 9def5d
    fflush(NULL);
Packit Service 9def5d
    CHECK(dup2(cap_fd, fd_) != -1);
Packit Service 9def5d
    CHECK(close(cap_fd) != -1);
Packit Service 9def5d
  }
Packit Service 9def5d
Packit Service 9def5d
  // Remove output redirection
Packit Service 9def5d
  void StopCapture() {
Packit Service 9def5d
    // Restore original stream
Packit Service 9def5d
    if (uncaptured_fd_ != -1) {
Packit Service 9def5d
      fflush(NULL);
Packit Service 9def5d
      CHECK(dup2(uncaptured_fd_, fd_) != -1);
Packit Service 9def5d
    }
Packit Service 9def5d
  }
Packit Service 9def5d
Packit Service 9def5d
  const string & filename() const { return filename_; }
Packit Service 9def5d
Packit Service 9def5d
 private:
Packit Service 9def5d
  int fd_;             // file descriptor being captured
Packit Service 9def5d
  int uncaptured_fd_;  // where the stream was originally being sent to
Packit Service 9def5d
  string filename_;    // file where stream is being saved
Packit Service 9def5d
};
Packit Service 9def5d
static CapturedStream * s_captured_streams[STDERR_FILENO+1];
Packit Service 9def5d
// Redirect a file descriptor to a file.
Packit Service 9def5d
//   fd       - Should be STDOUT_FILENO or STDERR_FILENO
Packit Service 9def5d
//   filename - File where output should be stored
Packit Service 9def5d
static inline void CaptureTestOutput(int fd, const string & filename) {
Packit Service 9def5d
  CHECK((fd == STDOUT_FILENO) || (fd == STDERR_FILENO));
Packit Service 9def5d
  CHECK(s_captured_streams[fd] == NULL);
Packit Service 9def5d
  s_captured_streams[fd] = new CapturedStream(fd, filename);
Packit Service 9def5d
}
Packit Service 9def5d
static inline void CaptureTestStderr() {
Packit Service 9def5d
  CaptureTestOutput(STDERR_FILENO, FLAGS_test_tmpdir + "/captured.err");
Packit Service 9def5d
}
Packit Service 9def5d
// Return the size (in bytes) of a file
Packit Service 9def5d
static inline size_t GetFileSize(FILE * file) {
Packit Service 9def5d
  fseek(file, 0, SEEK_END);
Packit Service 9def5d
  return static_cast<size_t>(ftell(file));
Packit Service 9def5d
}
Packit Service 9def5d
// Read the entire content of a file as a string
Packit Service 9def5d
static inline string ReadEntireFile(FILE * file) {
Packit Service 9def5d
  const size_t file_size = GetFileSize(file);
Packit Service 9def5d
  char * const buffer = new char[file_size];
Packit Service 9def5d
Packit Service 9def5d
  size_t bytes_last_read = 0;  // # of bytes read in the last fread()
Packit Service 9def5d
  size_t bytes_read = 0;       // # of bytes read so far
Packit Service 9def5d
Packit Service 9def5d
  fseek(file, 0, SEEK_SET);
Packit Service 9def5d
Packit Service 9def5d
  // Keep reading the file until we cannot read further or the
Packit Service 9def5d
  // pre-determined file size is reached.
Packit Service 9def5d
  do {
Packit Service 9def5d
    bytes_last_read = fread(buffer+bytes_read, 1, file_size-bytes_read, file);
Packit Service 9def5d
    bytes_read += bytes_last_read;
Packit Service 9def5d
  } while (bytes_last_read > 0 && bytes_read < file_size);
Packit Service 9def5d
Packit Service 9def5d
  const string content = string(buffer, buffer+bytes_read);
Packit Service 9def5d
  delete[] buffer;
Packit Service 9def5d
Packit Service 9def5d
  return content;
Packit Service 9def5d
}
Packit Service 9def5d
// Get the captured stdout (when fd is STDOUT_FILENO) or stderr (when
Packit Service 9def5d
// fd is STDERR_FILENO) as a string
Packit Service 9def5d
static inline string GetCapturedTestOutput(int fd) {
Packit Service 9def5d
  CHECK(fd == STDOUT_FILENO || fd == STDERR_FILENO);
Packit Service 9def5d
  CapturedStream * const cap = s_captured_streams[fd];
Packit Service 9def5d
  CHECK(cap)
Packit Service 9def5d
    << ": did you forget CaptureTestStdout() or CaptureTestStderr()?";
Packit Service 9def5d
Packit Service 9def5d
  // Make sure everything is flushed.
Packit Service 9def5d
  cap->StopCapture();
Packit Service 9def5d
Packit Service 9def5d
  // Read the captured file.
Packit Service 9def5d
  FILE * const file = fopen(cap->filename().c_str(), "r");
Packit Service 9def5d
  const string content = ReadEntireFile(file);
Packit Service 9def5d
  fclose(file);
Packit Service 9def5d
Packit Service 9def5d
  delete cap;
Packit Service 9def5d
  s_captured_streams[fd] = NULL;
Packit Service 9def5d
Packit Service 9def5d
  return content;
Packit Service 9def5d
}
Packit Service 9def5d
// Get the captured stderr of a test as a string.
Packit Service 9def5d
static inline string GetCapturedTestStderr() {
Packit Service 9def5d
  return GetCapturedTestOutput(STDERR_FILENO);
Packit Service 9def5d
}
Packit Service 9def5d
Packit Service 9def5d
// Check if the string is [IWEF](\d{4}|DATE)
Packit Service 9def5d
static inline bool IsLoggingPrefix(const string& s) {
Packit Service 9def5d
  if (s.size() != 5) return false;
Packit Service 9def5d
  if (!strchr("IWEF", s[0])) return false;
Packit Service 9def5d
  for (int i = 1; i <= 4; ++i) {
Packit Service 9def5d
    if (!isdigit(s[i]) && s[i] != "DATE"[i-1]) return false;
Packit Service 9def5d
  }
Packit Service 9def5d
  return true;
Packit Service 9def5d
}
Packit Service 9def5d
Packit Service 9def5d
// Convert log output into normalized form.
Packit Service 9def5d
//
Packit Service 9def5d
// Example:
Packit Service 9def5d
//     I0102 030405 logging_unittest.cc:345] RAW: vlog -1
Packit Service 9def5d
//  => IDATE TIME__ logging_unittest.cc:LINE] RAW: vlog -1
Packit Service 9def5d
static inline string MungeLine(const string& line) {
Packit Service 9def5d
  std::istringstream iss(line);
Packit Service 9def5d
  string before, logcode_date, time, thread_lineinfo;
Packit Service 9def5d
  iss >> logcode_date;
Packit Service 9def5d
  while (!IsLoggingPrefix(logcode_date)) {
Packit Service 9def5d
    before += " " + logcode_date;
Packit Service 9def5d
    if (!(iss >> logcode_date)) {
Packit Service 9def5d
      // We cannot find the header of log output.
Packit Service 9def5d
      return before;
Packit Service 9def5d
    }
Packit Service 9def5d
  }
Packit Service 9def5d
  if (!before.empty()) before += " ";
Packit Service 9def5d
  iss >> time;
Packit Service 9def5d
  iss >> thread_lineinfo;
Packit Service 9def5d
  CHECK(!thread_lineinfo.empty());
Packit Service 9def5d
  if (thread_lineinfo[thread_lineinfo.size() - 1] != ']') {
Packit Service 9def5d
    // We found thread ID.
Packit Service 9def5d
    string tmp;
Packit Service 9def5d
    iss >> tmp;
Packit Service 9def5d
    CHECK(!tmp.empty());
Packit Service 9def5d
    CHECK_EQ(']', tmp[tmp.size() - 1]);
Packit Service 9def5d
    thread_lineinfo = "THREADID " + tmp;
Packit Service 9def5d
  }
Packit Service 9def5d
  size_t index = thread_lineinfo.find(':');
Packit Service 9def5d
  CHECK_NE(string::npos, index);
Packit Service 9def5d
  thread_lineinfo = thread_lineinfo.substr(0, index+1) + "LINE]";
Packit Service 9def5d
  string rest;
Packit Service 9def5d
  std::getline(iss, rest);
Packit Service 9def5d
  return (before + logcode_date[0] + "DATE TIME__ " + thread_lineinfo +
Packit Service 9def5d
          MungeLine(rest));
Packit Service 9def5d
}
Packit Service 9def5d
Packit Service 9def5d
static inline void StringReplace(string* str,
Packit Service 9def5d
                          const string& oldsub,
Packit Service 9def5d
                          const string& newsub) {
Packit Service 9def5d
  size_t pos = str->find(oldsub);
Packit Service 9def5d
  if (pos != string::npos) {
Packit Service 9def5d
    str->replace(pos, oldsub.size(), newsub.c_str());
Packit Service 9def5d
  }
Packit Service 9def5d
}
Packit Service 9def5d
Packit Service 9def5d
static inline string Munge(const string& filename) {
Packit Service 9def5d
  FILE* fp = fopen(filename.c_str(), "rb");
Packit Service 9def5d
  CHECK(fp != NULL) << filename << ": couldn't open";
Packit Service 9def5d
  char buf[4096];
Packit Service 9def5d
  string result;
Packit Service 9def5d
  while (fgets(buf, 4095, fp)) {
Packit Service 9def5d
    string line = MungeLine(buf);
Packit Service 9def5d
    char null_str[256];
Packit Service 9def5d
    sprintf(null_str, "%p", static_cast<void*>(NULL));
Packit Service 9def5d
    StringReplace(&line, "__NULLP__", null_str);
Packit Service 9def5d
    // Remove 0x prefix produced by %p. VC++ doesn't put the prefix.
Packit Service 9def5d
    StringReplace(&line, " 0x", " ");
Packit Service 9def5d
Packit Service 9def5d
    StringReplace(&line, "__SUCCESS__", StrError(0));
Packit Service 9def5d
    StringReplace(&line, "__ENOENT__", StrError(ENOENT));
Packit Service 9def5d
    StringReplace(&line, "__EINTR__", StrError(EINTR));
Packit Service 9def5d
    StringReplace(&line, "__ENXIO__", StrError(ENXIO));
Packit Service 9def5d
    StringReplace(&line, "__ENOEXEC__", StrError(ENOEXEC));
Packit Service 9def5d
    result += line + "\n";
Packit Service 9def5d
  }
Packit Service 9def5d
  fclose(fp);
Packit Service 9def5d
  return result;
Packit Service 9def5d
}
Packit Service 9def5d
Packit Service 9def5d
static inline void WriteToFile(const string& body, const string& file) {
Packit Service 9def5d
  FILE* fp = fopen(file.c_str(), "wb");
Packit Service 9def5d
  fwrite(body.data(), 1, body.size(), fp);
Packit Service 9def5d
  fclose(fp);
Packit Service 9def5d
}
Packit Service 9def5d
Packit Service 9def5d
static inline bool MungeAndDiffTestStderr(const string& golden_filename) {
Packit Service 9def5d
  CapturedStream* cap = s_captured_streams[STDERR_FILENO];
Packit Service 9def5d
  CHECK(cap) << ": did you forget CaptureTestStderr()?";
Packit Service 9def5d
Packit Service 9def5d
  cap->StopCapture();
Packit Service 9def5d
Packit Service 9def5d
  // Run munge
Packit Service 9def5d
  const string captured = Munge(cap->filename());
Packit Service 9def5d
  const string golden = Munge(golden_filename);
Packit Service 9def5d
  if (captured != golden) {
Packit Service 9def5d
    fprintf(stderr,
Packit Service 9def5d
            "Test with golden file failed. We'll try to show the diff:\n");
Packit Service 9def5d
    string munged_golden = golden_filename + ".munged";
Packit Service 9def5d
    WriteToFile(golden, munged_golden);
Packit Service 9def5d
    string munged_captured = cap->filename() + ".munged";
Packit Service 9def5d
    WriteToFile(captured, munged_captured);
Packit Service 9def5d
    string diffcmd("diff -u " + munged_golden + " " + munged_captured);
Packit Service 9def5d
    if (system(diffcmd.c_str()) != 0) {
Packit Service 9def5d
      fprintf(stderr, "diff command was failed.\n");
Packit Service 9def5d
    }
Packit Service 9def5d
    unlink(munged_golden.c_str());
Packit Service 9def5d
    unlink(munged_captured.c_str());
Packit Service 9def5d
    return false;
Packit Service 9def5d
  }
Packit Service 9def5d
  LOG(INFO) << "Diff was successful";
Packit Service 9def5d
  return true;
Packit Service 9def5d
}
Packit Service 9def5d
Packit Service 9def5d
// Save flags used from logging_unittest.cc.
Packit Service 9def5d
#ifndef HAVE_LIB_GFLAGS
Packit Service 9def5d
struct FlagSaver {
Packit Service 9def5d
  FlagSaver()
Packit Service 9def5d
      : v_(FLAGS_v),
Packit Service 9def5d
        stderrthreshold_(FLAGS_stderrthreshold),
Packit Service 9def5d
        logtostderr_(FLAGS_logtostderr),
Packit Service 9def5d
        alsologtostderr_(FLAGS_alsologtostderr) {}
Packit Service 9def5d
  ~FlagSaver() {
Packit Service 9def5d
    FLAGS_v = v_;
Packit Service 9def5d
    FLAGS_stderrthreshold = stderrthreshold_;
Packit Service 9def5d
    FLAGS_logtostderr = logtostderr_;
Packit Service 9def5d
    FLAGS_alsologtostderr = alsologtostderr_;
Packit Service 9def5d
  }
Packit Service 9def5d
  int v_;
Packit Service 9def5d
  int stderrthreshold_;
Packit Service 9def5d
  bool logtostderr_;
Packit Service 9def5d
  bool alsologtostderr_;
Packit Service 9def5d
};
Packit Service 9def5d
#endif
Packit Service 9def5d
Packit Service 9def5d
class Thread {
Packit Service 9def5d
 public:
Packit Service 9def5d
  virtual ~Thread() {}
Packit Service 9def5d
Packit Service 9def5d
  void SetJoinable(bool) {}
Packit Service 9def5d
#if defined(OS_WINDOWS) || defined(OS_CYGWIN)
Packit Service 9def5d
  void Start() {
Packit Service 9def5d
    handle_ = CreateThread(NULL,
Packit Service 9def5d
                           0,
Packit Service 9def5d
                           (LPTHREAD_START_ROUTINE)&Thread::InvokeThread,
Packit Service 9def5d
                           (LPVOID)this,
Packit Service 9def5d
                           0,
Packit Service 9def5d
                           &th_;;
Packit Service 9def5d
    CHECK(handle_) << "CreateThread";
Packit Service 9def5d
  }
Packit Service 9def5d
  void Join() {
Packit Service 9def5d
    WaitForSingleObject(handle_, INFINITE);
Packit Service 9def5d
  }
Packit Service 9def5d
#elif defined(HAVE_PTHREAD)
Packit Service 9def5d
  void Start() {
Packit Service 9def5d
    pthread_create(&th_, NULL, &Thread::InvokeThread, this);
Packit Service 9def5d
  }
Packit Service 9def5d
  void Join() {
Packit Service 9def5d
    pthread_join(th_, NULL);
Packit Service 9def5d
  }
Packit Service 9def5d
#else
Packit Service 9def5d
# error No thread implementation.
Packit Service 9def5d
#endif
Packit Service 9def5d
Packit Service 9def5d
 protected:
Packit Service 9def5d
  virtual void Run() = 0;
Packit Service 9def5d
Packit Service 9def5d
 private:
Packit Service 9def5d
  static void* InvokeThread(void* self) {
Packit Service 9def5d
    ((Thread*)self)->Run();
Packit Service 9def5d
    return NULL;
Packit Service 9def5d
  }
Packit Service 9def5d
Packit Service 9def5d
#if defined(OS_WINDOWS) || defined(OS_CYGWIN)
Packit Service 9def5d
  HANDLE handle_;
Packit Service 9def5d
  DWORD th_;
Packit Service 9def5d
#else
Packit Service 9def5d
  pthread_t th_;
Packit Service 9def5d
#endif
Packit Service 9def5d
};
Packit Service 9def5d
Packit Service 9def5d
static inline void SleepForMilliseconds(int t) {
Packit Service 9def5d
#ifndef OS_WINDOWS
Packit Service 9def5d
  usleep(t * 1000);
Packit Service 9def5d
#else
Packit Service 9def5d
  Sleep(t);
Packit Service 9def5d
#endif
Packit Service 9def5d
}
Packit Service 9def5d
Packit Service 9def5d
// Add hook for operator new to ensure there are no memory allocation.
Packit Service 9def5d
Packit Service 9def5d
void (*g_new_hook)() = NULL;
Packit Service 9def5d
Packit Service 9def5d
_END_GOOGLE_NAMESPACE_
Packit Service 9def5d
Packit Service 9def5d
void* operator new(size_t size) throw(std::bad_alloc) {
Packit Service 9def5d
  if (GOOGLE_NAMESPACE::g_new_hook) {
Packit Service 9def5d
    GOOGLE_NAMESPACE::g_new_hook();
Packit Service 9def5d
  }
Packit Service 9def5d
  return malloc(size);
Packit Service 9def5d
}
Packit Service 9def5d
Packit Service 9def5d
void* operator new[](size_t size) throw(std::bad_alloc) {
Packit Service 9def5d
  return ::operator new(size);
Packit Service 9def5d
}
Packit Service 9def5d
Packit Service 9def5d
void operator delete(void* p) throw() {
Packit Service 9def5d
  free(p);
Packit Service 9def5d
}
Packit Service 9def5d
Packit Service 9def5d
void operator delete[](void* p) throw() {
Packit Service 9def5d
  ::operator delete(p);
Packit Service 9def5d
}