C++程序  |  78行  |  2.05 KB

/*
 * Copyright (C) 2018 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#include <gtest/gtest.h>

#include "Color.h"

namespace android {
namespace gtest_extras {

static bool ShouldUseColor() {
  const auto& gtest_color = ::testing::GTEST_FLAG(color);
  if (gtest_color == "yes" || gtest_color == "true" || gtest_color == "t") {
    return true;
  }
  if (gtest_color != "auto") {
    return false;
  }

  bool stdout_is_tty = isatty(STDOUT_FILENO) != 0;
  if (!stdout_is_tty) {
    return false;
  }

  std::string color_term;
  const char* const color_term_env = getenv("COLORTERM");
  if (color_term_env != nullptr) {
    color_term = color_term_env;
  }
  std::string term;
  const char* const term_env = getenv("TERM");
  if (term_env != nullptr) {
    term = term_env;
  }
  return !color_term.empty() || term == "xterm" || term == "xterm-color" ||
         term == "xterm-256color" || term == "screen" || term == "screen-256color" ||
         term == "tmux" || term == "tmux-256color" || term == "rxvt-unicode" ||
         term == "rxvt-unicode-256color" || term == "linux" || term == "cygwing";
}

void ColoredPrintf(const char* color, const char* fmt, ...) {
  static const bool use_color = ShouldUseColor();

  va_list args;
  va_start(args, fmt);

  if (!use_color) {
    vprintf(fmt, args);
  } else {
    printf("%s", color);
    vprintf(fmt, args);
    printf("%s", COLOR_RESET);
  }

  va_end(args);
}

}  // namespace gtest_extras
}  // namespace android