Export of internal Abseil changes
-- cf6037b985b629c253b8a87e4408c88a61baf89a by Abseil Team <absl-team@google.com>: Adds an example of using ABSL_DEPRECATED on a template. Without this, it's unclear where to add this annotation (e.g. before template <> or after it). PiperOrigin-RevId: 270057224 -- c53bc14dd683cc1e41c940a337001b42a0270eaf by Andy Getzendanner <durandal@google.com>: Parser and unparser for command-line flags of type absl::LogSeverity. PiperOrigin-RevId: 269939999 -- d91174b02f3b213f0b26701d9d97c79f809e6fea by Abseil Team <absl-team@google.com>: Fix a typo. PiperOrigin-RevId: 269738777 GitOrigin-RevId: cf6037b985b629c253b8a87e4408c88a61baf89a Change-Id: I6cec3101014e4c77f4ff2edb4c91740982dbb459
This commit is contained in:
parent
6ec1362810
commit
ddf8e52a29
9 changed files with 234 additions and 38 deletions
|
@ -575,6 +575,8 @@ cc_test(
|
|||
linkopts = ABSL_DEFAULT_LINKOPTS,
|
||||
deps = [
|
||||
":log_severity",
|
||||
"//absl/flags:marshalling",
|
||||
"//absl/strings",
|
||||
"@com_google_googletest//:gtest_main",
|
||||
],
|
||||
)
|
||||
|
|
|
@ -529,7 +529,9 @@ absl_cc_test(
|
|||
SRCS
|
||||
"log_severity_test.cc"
|
||||
DEPS
|
||||
absl::flags_marshalling
|
||||
absl::log_severity
|
||||
absl::strings
|
||||
gmock
|
||||
gtest_main
|
||||
)
|
||||
|
|
|
@ -25,6 +25,19 @@ namespace absl {
|
|||
// Four severity levels are defined. Logging APIs should terminate the program
|
||||
// when a message is logged at severity `kFatal`; the other levels have no
|
||||
// special semantics.
|
||||
//
|
||||
// Abseil flags may be defined with type `LogSeverity`. Dependency layering
|
||||
// constraints require that the `AbslParseFlag` overload be declared and defined
|
||||
// in the flags module rather than here. The `AbslUnparseFlag` overload is
|
||||
// defined there too for consistency.
|
||||
//
|
||||
// The parser accepts arbitrary integers (as if the type were `int`). It also
|
||||
// accepts each named enumerator, without regard for case, with or without the
|
||||
// leading 'k'. For example: "kInfo", "INFO", and "info" all parse to the value
|
||||
// `absl::LogSeverity::kInfo`.
|
||||
//
|
||||
// Unparsing a flag produces the same result as `absl::LogSeverityName()` for
|
||||
// the standard levels and a base-ten integer otherwise.
|
||||
enum class LogSeverity : int {
|
||||
kInfo = 0,
|
||||
kWarning = 1,
|
||||
|
@ -40,7 +53,7 @@ constexpr std::array<absl::LogSeverity, 4> LogSeverities() {
|
|||
}
|
||||
|
||||
// Returns the all-caps string representation (e.g. "INFO") of the specified
|
||||
// severity level if it is one of the normal levels and "UNKNOWN" otherwise.
|
||||
// severity level if it is one of the standard levels and "UNKNOWN" otherwise.
|
||||
constexpr const char* LogSeverityName(absl::LogSeverity s) {
|
||||
return s == absl::LogSeverity::kInfo
|
||||
? "INFO"
|
||||
|
@ -59,7 +72,7 @@ constexpr absl::LogSeverity NormalizeLogSeverity(absl::LogSeverity s) {
|
|||
: s > absl::LogSeverity::kFatal ? absl::LogSeverity::kError : s;
|
||||
}
|
||||
constexpr absl::LogSeverity NormalizeLogSeverity(int s) {
|
||||
return NormalizeLogSeverity(static_cast<absl::LogSeverity>(s));
|
||||
return absl::NormalizeLogSeverity(static_cast<absl::LogSeverity>(s));
|
||||
}
|
||||
|
||||
// The exact representation of a streamed `absl::LogSeverity` is deliberately
|
||||
|
|
|
@ -14,14 +14,25 @@
|
|||
|
||||
#include "absl/base/log_severity.h"
|
||||
|
||||
#include <cstdint>
|
||||
#include <ios>
|
||||
#include <limits>
|
||||
#include <ostream>
|
||||
#include <sstream>
|
||||
#include <string>
|
||||
#include <tuple>
|
||||
|
||||
#include "gmock/gmock.h"
|
||||
#include "gtest/gtest.h"
|
||||
#include "absl/flags/marshalling.h"
|
||||
#include "absl/strings/str_cat.h"
|
||||
|
||||
namespace {
|
||||
using testing::Eq;
|
||||
using ::testing::Eq;
|
||||
using ::testing::IsFalse;
|
||||
using ::testing::IsTrue;
|
||||
using ::testing::TestWithParam;
|
||||
using ::testing::Values;
|
||||
|
||||
std::string StreamHelper(absl::LogSeverity value) {
|
||||
std::ostringstream stream;
|
||||
|
@ -40,4 +51,149 @@ TEST(StreamTest, Works) {
|
|||
Eq("absl::LogSeverity(4)"));
|
||||
}
|
||||
|
||||
using ParseFlagFromOutOfRangeIntegerTest = TestWithParam<int64_t>;
|
||||
INSTANTIATE_TEST_SUITE_P(
|
||||
Instantiation, ParseFlagFromOutOfRangeIntegerTest,
|
||||
Values(static_cast<int64_t>(std::numeric_limits<int>::min()) - 1,
|
||||
static_cast<int64_t>(std::numeric_limits<int>::max()) + 1));
|
||||
TEST_P(ParseFlagFromOutOfRangeIntegerTest, ReturnsError) {
|
||||
const std::string to_parse = absl::StrCat(GetParam());
|
||||
absl::LogSeverity value;
|
||||
std::string error;
|
||||
EXPECT_THAT(absl::ParseFlag(to_parse, &value, &error), IsFalse()) << value;
|
||||
}
|
||||
|
||||
using ParseFlagFromAlmostOutOfRangeIntegerTest = TestWithParam<int>;
|
||||
INSTANTIATE_TEST_SUITE_P(Instantiation,
|
||||
ParseFlagFromAlmostOutOfRangeIntegerTest,
|
||||
Values(std::numeric_limits<int>::min(),
|
||||
std::numeric_limits<int>::max()));
|
||||
TEST_P(ParseFlagFromAlmostOutOfRangeIntegerTest, YieldsExpectedValue) {
|
||||
const auto expected = static_cast<absl::LogSeverity>(GetParam());
|
||||
const std::string to_parse = absl::StrCat(GetParam());
|
||||
absl::LogSeverity value;
|
||||
std::string error;
|
||||
ASSERT_THAT(absl::ParseFlag(to_parse, &value, &error), IsTrue()) << error;
|
||||
EXPECT_THAT(value, Eq(expected));
|
||||
}
|
||||
|
||||
using ParseFlagFromIntegerMatchingEnumeratorTest =
|
||||
TestWithParam<std::tuple<absl::string_view, absl::LogSeverity>>;
|
||||
INSTANTIATE_TEST_SUITE_P(
|
||||
Instantiation, ParseFlagFromIntegerMatchingEnumeratorTest,
|
||||
Values(std::make_tuple("0", absl::LogSeverity::kInfo),
|
||||
std::make_tuple(" 0", absl::LogSeverity::kInfo),
|
||||
std::make_tuple("-0", absl::LogSeverity::kInfo),
|
||||
std::make_tuple("+0", absl::LogSeverity::kInfo),
|
||||
std::make_tuple("00", absl::LogSeverity::kInfo),
|
||||
std::make_tuple("0 ", absl::LogSeverity::kInfo),
|
||||
std::make_tuple("0x0", absl::LogSeverity::kInfo),
|
||||
std::make_tuple("1", absl::LogSeverity::kWarning),
|
||||
std::make_tuple("+1", absl::LogSeverity::kWarning),
|
||||
std::make_tuple("2", absl::LogSeverity::kError),
|
||||
std::make_tuple("3", absl::LogSeverity::kFatal)));
|
||||
TEST_P(ParseFlagFromIntegerMatchingEnumeratorTest, YieldsExpectedValue) {
|
||||
const absl::string_view to_parse = std::get<0>(GetParam());
|
||||
const absl::LogSeverity expected = std::get<1>(GetParam());
|
||||
absl::LogSeverity value;
|
||||
std::string error;
|
||||
ASSERT_THAT(absl::ParseFlag(to_parse, &value, &error), IsTrue()) << error;
|
||||
EXPECT_THAT(value, Eq(expected));
|
||||
}
|
||||
|
||||
using ParseFlagFromOtherIntegerTest =
|
||||
TestWithParam<std::tuple<absl::string_view, int>>;
|
||||
INSTANTIATE_TEST_SUITE_P(Instantiation, ParseFlagFromOtherIntegerTest,
|
||||
Values(std::make_tuple("-1", -1),
|
||||
std::make_tuple("4", 4),
|
||||
std::make_tuple("010", 10),
|
||||
std::make_tuple("0x10", 16)));
|
||||
TEST_P(ParseFlagFromOtherIntegerTest, YieldsExpectedValue) {
|
||||
const absl::string_view to_parse = std::get<0>(GetParam());
|
||||
const auto expected = static_cast<absl::LogSeverity>(std::get<1>(GetParam()));
|
||||
absl::LogSeverity value;
|
||||
std::string error;
|
||||
ASSERT_THAT(absl::ParseFlag(to_parse, &value, &error), IsTrue()) << error;
|
||||
EXPECT_THAT(value, Eq(expected));
|
||||
}
|
||||
|
||||
using ParseFlagFromEnumeratorTest =
|
||||
TestWithParam<std::tuple<absl::string_view, absl::LogSeverity>>;
|
||||
INSTANTIATE_TEST_SUITE_P(
|
||||
Instantiation, ParseFlagFromEnumeratorTest,
|
||||
Values(std::make_tuple("INFO", absl::LogSeverity::kInfo),
|
||||
std::make_tuple("info", absl::LogSeverity::kInfo),
|
||||
std::make_tuple("kInfo", absl::LogSeverity::kInfo),
|
||||
std::make_tuple("iNfO", absl::LogSeverity::kInfo),
|
||||
std::make_tuple("kInFo", absl::LogSeverity::kInfo),
|
||||
std::make_tuple("WARNING", absl::LogSeverity::kWarning),
|
||||
std::make_tuple("warning", absl::LogSeverity::kWarning),
|
||||
std::make_tuple("kWarning", absl::LogSeverity::kWarning),
|
||||
std::make_tuple("WaRnInG", absl::LogSeverity::kWarning),
|
||||
std::make_tuple("KwArNiNg", absl::LogSeverity::kWarning),
|
||||
std::make_tuple("ERROR", absl::LogSeverity::kError),
|
||||
std::make_tuple("error", absl::LogSeverity::kError),
|
||||
std::make_tuple("kError", absl::LogSeverity::kError),
|
||||
std::make_tuple("eRrOr", absl::LogSeverity::kError),
|
||||
std::make_tuple("kErRoR", absl::LogSeverity::kError),
|
||||
std::make_tuple("FATAL", absl::LogSeverity::kFatal),
|
||||
std::make_tuple("fatal", absl::LogSeverity::kFatal),
|
||||
std::make_tuple("kFatal", absl::LogSeverity::kFatal),
|
||||
std::make_tuple("FaTaL", absl::LogSeverity::kFatal),
|
||||
std::make_tuple("KfAtAl", absl::LogSeverity::kFatal)));
|
||||
TEST_P(ParseFlagFromEnumeratorTest, YieldsExpectedValue) {
|
||||
const absl::string_view to_parse = std::get<0>(GetParam());
|
||||
const absl::LogSeverity expected = std::get<1>(GetParam());
|
||||
absl::LogSeverity value;
|
||||
std::string error;
|
||||
ASSERT_THAT(absl::ParseFlag(to_parse, &value, &error), IsTrue()) << error;
|
||||
EXPECT_THAT(value, Eq(expected));
|
||||
}
|
||||
|
||||
using ParseFlagFromGarbageTest = TestWithParam<absl::string_view>;
|
||||
INSTANTIATE_TEST_SUITE_P(Instantiation, ParseFlagFromGarbageTest,
|
||||
Values("", "\0", " ", "garbage", "kkinfo", "I"));
|
||||
TEST_P(ParseFlagFromGarbageTest, ReturnsError) {
|
||||
const absl::string_view to_parse = GetParam();
|
||||
absl::LogSeverity value;
|
||||
std::string error;
|
||||
EXPECT_THAT(absl::ParseFlag(to_parse, &value, &error), IsFalse()) << value;
|
||||
}
|
||||
|
||||
using UnparseFlagToEnumeratorTest =
|
||||
TestWithParam<std::tuple<absl::LogSeverity, absl::string_view>>;
|
||||
INSTANTIATE_TEST_SUITE_P(
|
||||
Instantiation, UnparseFlagToEnumeratorTest,
|
||||
Values(std::make_tuple(absl::LogSeverity::kInfo, "INFO"),
|
||||
std::make_tuple(absl::LogSeverity::kWarning, "WARNING"),
|
||||
std::make_tuple(absl::LogSeverity::kError, "ERROR"),
|
||||
std::make_tuple(absl::LogSeverity::kFatal, "FATAL")));
|
||||
TEST_P(UnparseFlagToEnumeratorTest, ReturnsExpectedValueAndRoundTrips) {
|
||||
const absl::LogSeverity to_unparse = std::get<0>(GetParam());
|
||||
const absl::string_view expected = std::get<1>(GetParam());
|
||||
const std::string stringified_value = absl::UnparseFlag(to_unparse);
|
||||
EXPECT_THAT(stringified_value, Eq(expected));
|
||||
absl::LogSeverity reparsed_value;
|
||||
std::string error;
|
||||
EXPECT_THAT(absl::ParseFlag(stringified_value, &reparsed_value, &error),
|
||||
IsTrue());
|
||||
EXPECT_THAT(reparsed_value, Eq(to_unparse));
|
||||
}
|
||||
|
||||
using UnparseFlagToOtherIntegerTest = TestWithParam<int>;
|
||||
INSTANTIATE_TEST_SUITE_P(Instantiation, UnparseFlagToOtherIntegerTest,
|
||||
Values(std::numeric_limits<int>::min(), -1, 4,
|
||||
std::numeric_limits<int>::max()));
|
||||
TEST_P(UnparseFlagToOtherIntegerTest, ReturnsExpectedValueAndRoundTrips) {
|
||||
const absl::LogSeverity to_unparse =
|
||||
static_cast<absl::LogSeverity>(GetParam());
|
||||
const std::string expected = absl::StrCat(GetParam());
|
||||
const std::string stringified_value = absl::UnparseFlag(to_unparse);
|
||||
EXPECT_THAT(stringified_value, Eq(expected));
|
||||
absl::LogSeverity reparsed_value;
|
||||
std::string error;
|
||||
EXPECT_THAT(absl::ParseFlag(stringified_value, &reparsed_value, &error),
|
||||
IsTrue());
|
||||
EXPECT_THAT(reparsed_value, Eq(to_unparse));
|
||||
}
|
||||
} // namespace
|
||||
|
|
|
@ -137,10 +137,15 @@ enum LinkerInitialized {
|
|||
// declarations. The macro argument is used as a custom diagnostic message (e.g.
|
||||
// suggestion of a better alternative).
|
||||
//
|
||||
// Example:
|
||||
// Examples:
|
||||
//
|
||||
// class ABSL_DEPRECATED("Use Bar instead") Foo {...};
|
||||
// ABSL_DEPRECATED("Use Baz instead") void Bar() {...}
|
||||
//
|
||||
// ABSL_DEPRECATED("Use Baz() instead") void Bar() {...}
|
||||
//
|
||||
// template <typename T>
|
||||
// ABSL_DEPRECATED("Use DoThat() instead")
|
||||
// void DoThis();
|
||||
//
|
||||
// Every usage of a deprecated entity will trigger a warning when compiled with
|
||||
// clang's `-Wdeprecated-declarations` option. This option is turned off by
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue