| Index: sdch/open_vcdiff/depot/opensource/open-vcdiff/src/gtest/gtest-port.cc
|
| ===================================================================
|
| --- sdch/open_vcdiff/depot/opensource/open-vcdiff/src/gtest/gtest-port.cc (revision 2678)
|
| +++ sdch/open_vcdiff/depot/opensource/open-vcdiff/src/gtest/gtest-port.cc (working copy)
|
| @@ -1,292 +0,0 @@
|
| -// Copyright 2008, Google Inc.
|
| -// All rights reserved.
|
| -//
|
| -// Redistribution and use in source and binary forms, with or without
|
| -// modification, are permitted provided that the following conditions are
|
| -// met:
|
| -//
|
| -// * Redistributions of source code must retain the above copyright
|
| -// notice, this list of conditions and the following disclaimer.
|
| -// * Redistributions in binary form must reproduce the above
|
| -// copyright notice, this list of conditions and the following disclaimer
|
| -// in the documentation and/or other materials provided with the
|
| -// distribution.
|
| -// * Neither the name of Google Inc. nor the names of its
|
| -// contributors may be used to endorse or promote products derived from
|
| -// this software without specific prior written permission.
|
| -//
|
| -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
| -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
| -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
| -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
| -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
| -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
| -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
| -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
| -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
| -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
| -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
| -//
|
| -// Author: wan@google.com (Zhanyong Wan)
|
| -
|
| -#include <gtest/internal/gtest-port.h>
|
| -
|
| -#include <limits.h>
|
| -#ifdef GTEST_HAS_DEATH_TEST
|
| -#include <regex.h>
|
| -#endif // GTEST_HAS_DEATH_TEST
|
| -#include <stdlib.h>
|
| -#include <stdio.h>
|
| -
|
| -#include <gtest/gtest-spi.h>
|
| -#include <gtest/gtest-message.h>
|
| -#include <gtest/internal/gtest-string.h>
|
| -
|
| -namespace testing {
|
| -namespace internal {
|
| -
|
| -#ifdef GTEST_HAS_DEATH_TEST
|
| -
|
| -// Implements RE. Currently only needed for death tests.
|
| -
|
| -RE::~RE() {
|
| - regfree(®ex_);
|
| - free(const_cast<char*>(pattern_));
|
| -}
|
| -
|
| -// Returns true iff str contains regular expression re.
|
| -bool RE::PartialMatch(const char* str, const RE& re) {
|
| - if (!re.is_valid_) return false;
|
| -
|
| - regmatch_t match;
|
| - return regexec(&re.regex_, str, 1, &match, 0) == 0;
|
| -}
|
| -
|
| -// Initializes an RE from its string representation.
|
| -void RE::Init(const char* regex) {
|
| - pattern_ = strdup(regex);
|
| - is_valid_ = regcomp(®ex_, regex, REG_EXTENDED) == 0;
|
| - EXPECT_TRUE(is_valid_)
|
| - << "Regular expression \"" << regex
|
| - << "\" is not a valid POSIX Extended regular expression.";
|
| -}
|
| -
|
| -#endif // GTEST_HAS_DEATH_TEST
|
| -
|
| -// Logs a message at the given severity level.
|
| -void GTestLog(GTestLogSeverity severity, const char* file,
|
| - int line, const char* msg) {
|
| - const char* const marker =
|
| - severity == GTEST_INFO ? "[ INFO ]" :
|
| - severity == GTEST_WARNING ? "[WARNING]" :
|
| - severity == GTEST_ERROR ? "[ ERROR ]" : "[ FATAL ]";
|
| - fprintf(stderr, "\n%s %s:%d: %s\n", marker, file, line, msg);
|
| - if (severity == GTEST_FATAL) {
|
| - abort();
|
| - }
|
| -}
|
| -
|
| -#ifdef GTEST_HAS_DEATH_TEST
|
| -
|
| -// Defines the stderr capturer.
|
| -
|
| -class CapturedStderr {
|
| - public:
|
| - // The ctor redirects stderr to a temporary file.
|
| - CapturedStderr() {
|
| - uncaptured_fd_ = dup(STDERR_FILENO);
|
| -
|
| - char name_template[] = "captured_stderr.XXXXXX";
|
| - const int captured_fd = mkstemp(name_template);
|
| - filename_ = name_template;
|
| - fflush(NULL);
|
| - dup2(captured_fd, STDERR_FILENO);
|
| - close(captured_fd);
|
| - }
|
| -
|
| - ~CapturedStderr() {
|
| - remove(filename_.c_str());
|
| - }
|
| -
|
| - // Stops redirecting stderr.
|
| - void StopCapture() {
|
| - // Restores the original stream.
|
| - fflush(NULL);
|
| - dup2(uncaptured_fd_, STDERR_FILENO);
|
| - close(uncaptured_fd_);
|
| - uncaptured_fd_ = -1;
|
| - }
|
| -
|
| - // Returns the name of the temporary file holding the stderr output.
|
| - // GTEST_HAS_DEATH_TEST implies that we have ::std::string, so we
|
| - // can use it here.
|
| - ::std::string filename() const { return filename_; }
|
| -
|
| - private:
|
| - int uncaptured_fd_;
|
| - ::std::string filename_;
|
| -};
|
| -
|
| -static CapturedStderr* g_captured_stderr = NULL;
|
| -
|
| -// Returns the size (in bytes) of a file.
|
| -static size_t GetFileSize(FILE * file) {
|
| - fseek(file, 0, SEEK_END);
|
| - return static_cast<size_t>(ftell(file));
|
| -}
|
| -
|
| -// Reads the entire content of a file as a string.
|
| -// GTEST_HAS_DEATH_TEST implies that we have ::std::string, so we can
|
| -// use it here.
|
| -static ::std::string ReadEntireFile(FILE * file) {
|
| - const size_t file_size = GetFileSize(file);
|
| - char* const buffer = new char[file_size];
|
| -
|
| - size_t bytes_last_read = 0; // # of bytes read in the last fread()
|
| - size_t bytes_read = 0; // # of bytes read so far
|
| -
|
| - fseek(file, 0, SEEK_SET);
|
| -
|
| - // Keeps reading the file until we cannot read further or the
|
| - // pre-determined file size is reached.
|
| - do {
|
| - bytes_last_read = fread(buffer+bytes_read, 1, file_size-bytes_read, file);
|
| - bytes_read += bytes_last_read;
|
| - } while (bytes_last_read > 0 && bytes_read < file_size);
|
| -
|
| - const ::std::string content(buffer, buffer+bytes_read);
|
| - delete[] buffer;
|
| -
|
| - return content;
|
| -}
|
| -
|
| -// Starts capturing stderr.
|
| -void CaptureStderr() {
|
| - if (g_captured_stderr != NULL) {
|
| - GTEST_LOG(FATAL, "Only one stderr capturer can exist at one time.");
|
| - }
|
| - g_captured_stderr = new CapturedStderr;
|
| -}
|
| -
|
| -// Stops capturing stderr and returns the captured string.
|
| -// GTEST_HAS_DEATH_TEST implies that we have ::std::string, so we can
|
| -// use it here.
|
| -::std::string GetCapturedStderr() {
|
| - g_captured_stderr->StopCapture();
|
| - FILE* const file = fopen(g_captured_stderr->filename().c_str(), "r");
|
| - const ::std::string content = ReadEntireFile(file);
|
| - fclose(file);
|
| -
|
| - delete g_captured_stderr;
|
| - g_captured_stderr = NULL;
|
| -
|
| - return content;
|
| -}
|
| -
|
| -// A copy of all command line arguments. Set by InitGoogleTest().
|
| -::std::vector<String> g_argvs;
|
| -
|
| -// Returns the command line as a vector of strings.
|
| -const ::std::vector<String>& GetArgvs() { return g_argvs; }
|
| -
|
| -#endif // GTEST_HAS_DEATH_TEST
|
| -
|
| -// Returns the name of the environment variable corresponding to the
|
| -// given flag. For example, FlagToEnvVar("foo") will return
|
| -// "GTEST_FOO" in the open-source version.
|
| -static String FlagToEnvVar(const char* flag) {
|
| - const String full_flag = (Message() << GTEST_FLAG_PREFIX << flag).GetString();
|
| -
|
| - Message env_var;
|
| - for (int i = 0; i != full_flag.GetLength(); i++) {
|
| - env_var << static_cast<char>(toupper(full_flag.c_str()[i]));
|
| - }
|
| -
|
| - return env_var.GetString();
|
| -}
|
| -
|
| -// Reads and returns the Boolean environment variable corresponding to
|
| -// the given flag; if it's not set, returns default_value.
|
| -//
|
| -// The value is considered true iff it's not "0".
|
| -bool BoolFromGTestEnv(const char* flag, bool default_value) {
|
| - const String env_var = FlagToEnvVar(flag);
|
| - const char* const string_value = GetEnv(env_var.c_str());
|
| - return string_value == NULL ?
|
| - default_value : strcmp(string_value, "0") != 0;
|
| -}
|
| -
|
| -// Parses 'str' for a 32-bit signed integer. If successful, writes
|
| -// the result to *value and returns true; otherwise leaves *value
|
| -// unchanged and returns false.
|
| -bool ParseInt32(const Message& src_text, const char* str, Int32* value) {
|
| - // Parses the environment variable as a decimal integer.
|
| - char* end = NULL;
|
| - const long long_value = strtol(str, &end, 10); // NOLINT
|
| -
|
| - // Has strtol() consumed all characters in the string?
|
| - if (*end != '\0') {
|
| - // No - an invalid character was encountered.
|
| - Message msg;
|
| - msg << "WARNING: " << src_text
|
| - << " is expected to be a 32-bit integer, but actually"
|
| - << " has value \"" << str << "\".\n";
|
| - printf("%s", msg.GetString().c_str());
|
| - fflush(stdout);
|
| - return false;
|
| - }
|
| -
|
| - // Is the parsed value in the range of an Int32?
|
| - const Int32 result = static_cast<Int32>(long_value);
|
| - if (long_value == LONG_MAX || long_value == LONG_MIN ||
|
| - // The parsed value overflows as a long. (strtol() returns
|
| - // LONG_MAX or LONG_MIN when the input overflows.)
|
| - result != long_value
|
| - // The parsed value overflows as an Int32.
|
| - ) {
|
| - Message msg;
|
| - msg << "WARNING: " << src_text
|
| - << " is expected to be a 32-bit integer, but actually"
|
| - << " has value " << str << ", which overflows.\n";
|
| - printf("%s", msg.GetString().c_str());
|
| - fflush(stdout);
|
| - return false;
|
| - }
|
| -
|
| - *value = result;
|
| - return true;
|
| -}
|
| -
|
| -// Reads and returns a 32-bit integer stored in the environment
|
| -// variable corresponding to the given flag; if it isn't set or
|
| -// doesn't represent a valid 32-bit integer, returns default_value.
|
| -Int32 Int32FromGTestEnv(const char* flag, Int32 default_value) {
|
| - const String env_var = FlagToEnvVar(flag);
|
| - const char* const string_value = GetEnv(env_var.c_str());
|
| - if (string_value == NULL) {
|
| - // The environment variable is not set.
|
| - return default_value;
|
| - }
|
| -
|
| - Int32 result = default_value;
|
| - if (!ParseInt32(Message() << "Environment variable " << env_var,
|
| - string_value, &result)) {
|
| - printf("The default value %s is used.\n",
|
| - (Message() << default_value).GetString().c_str());
|
| - fflush(stdout);
|
| - return default_value;
|
| - }
|
| -
|
| - return result;
|
| -}
|
| -
|
| -// Reads and returns the string environment variable corresponding to
|
| -// the given flag; if it's not set, returns default_value.
|
| -const char* StringFromGTestEnv(const char* flag, const char* default_value) {
|
| - const String env_var = FlagToEnvVar(flag);
|
| - const char* const value = GetEnv(env_var.c_str());
|
| - return value == NULL ? default_value : value;
|
| -}
|
| -
|
| -} // namespace internal
|
| -} // namespace testing
|
|
|