Commit e3114cc5 by Abseil Team Committed by Copybara-Service

Adds `AbslStringify` to `absl::Status` for completeness.

This also adds a test for `operator<<`.

PiperOrigin-RevId: 568590367
Change-Id: Ia0ad39cb582e7d24e6c4131827818d8c4b10dfd9
parent f4c6246d
...@@ -70,6 +70,7 @@ cc_test( ...@@ -70,6 +70,7 @@ cc_test(
":status", ":status",
"//absl/strings", "//absl/strings",
"//absl/strings:cord", "//absl/strings:cord",
"//absl/strings:str_format",
"@com_google_googletest//:gtest_main", "@com_google_googletest//:gtest_main",
], ],
) )
......
...@@ -56,6 +56,7 @@ absl_cc_test( ...@@ -56,6 +56,7 @@ absl_cc_test(
${ABSL_TEST_COPTS} ${ABSL_TEST_COPTS}
DEPS DEPS
absl::status absl::status
absl::str_format
absl::strings absl::strings
GTest::gmock_main GTest::gmock_main
) )
......
...@@ -64,7 +64,6 @@ ...@@ -64,7 +64,6 @@
#include "absl/functional/function_ref.h" #include "absl/functional/function_ref.h"
#include "absl/status/internal/status_internal.h" #include "absl/status/internal/status_internal.h"
#include "absl/strings/cord.h" #include "absl/strings/cord.h"
#include "absl/strings/str_cat.h"
#include "absl/strings/string_view.h" #include "absl/strings/string_view.h"
#include "absl/types/optional.h" #include "absl/types/optional.h"
...@@ -523,6 +522,12 @@ class Status final { ...@@ -523,6 +522,12 @@ class Status final {
std::string ToString( std::string ToString(
StatusToStringMode mode = StatusToStringMode::kDefault) const; StatusToStringMode mode = StatusToStringMode::kDefault) const;
// Support `absl::StrCat`, `absl::StrFormat`, etc.
template <typename Sink>
friend void AbslStringify(Sink& sink, const Status& status) {
sink.Append(status.ToString(StatusToStringMode::kWithEverything));
}
// Status::IgnoreError() // Status::IgnoreError()
// //
// Ignores any errors. This method does nothing except potentially suppress // Ignores any errors. This method does nothing except potentially suppress
......
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
#include "gtest/gtest.h" #include "gtest/gtest.h"
#include "absl/strings/cord.h" #include "absl/strings/cord.h"
#include "absl/strings/str_cat.h" #include "absl/strings/str_cat.h"
#include "absl/strings/str_format.h"
namespace { namespace {
...@@ -305,37 +306,77 @@ TEST(Status, TestForEachPayload) { ...@@ -305,37 +306,77 @@ TEST(Status, TestForEachPayload) {
} }
TEST(Status, ToString) { TEST(Status, ToString) {
absl::Status s(absl::StatusCode::kInternal, "fail"); absl::Status status(absl::StatusCode::kInternal, "fail");
EXPECT_EQ("INTERNAL: fail", s.ToString()); EXPECT_EQ("INTERNAL: fail", status.ToString());
s.SetPayload("foo", absl::Cord("bar")); status.SetPayload("foo", absl::Cord("bar"));
EXPECT_EQ("INTERNAL: fail [foo='bar']", s.ToString()); EXPECT_EQ("INTERNAL: fail [foo='bar']", status.ToString());
s.SetPayload("bar", absl::Cord("\377")); status.SetPayload("bar", absl::Cord("\377"));
EXPECT_THAT(s.ToString(), EXPECT_THAT(status.ToString(),
AllOf(HasSubstr("INTERNAL: fail"), HasSubstr("[foo='bar']"), AllOf(HasSubstr("INTERNAL: fail"), HasSubstr("[foo='bar']"),
HasSubstr("[bar='\\xff']"))); HasSubstr("[bar='\\xff']")));
} }
TEST(Status, ToStringMode) { TEST(Status, ToStringMode) {
absl::Status s(absl::StatusCode::kInternal, "fail"); absl::Status status(absl::StatusCode::kInternal, "fail");
s.SetPayload("foo", absl::Cord("bar")); status.SetPayload("foo", absl::Cord("bar"));
s.SetPayload("bar", absl::Cord("\377")); status.SetPayload("bar", absl::Cord("\377"));
EXPECT_EQ("INTERNAL: fail", EXPECT_EQ("INTERNAL: fail",
s.ToString(absl::StatusToStringMode::kWithNoExtraData)); status.ToString(absl::StatusToStringMode::kWithNoExtraData));
EXPECT_THAT(s.ToString(absl::StatusToStringMode::kWithPayload), EXPECT_THAT(status.ToString(absl::StatusToStringMode::kWithPayload),
AllOf(HasSubstr("INTERNAL: fail"), HasSubstr("[foo='bar']"), AllOf(HasSubstr("INTERNAL: fail"), HasSubstr("[foo='bar']"),
HasSubstr("[bar='\\xff']"))); HasSubstr("[bar='\\xff']")));
EXPECT_THAT(s.ToString(absl::StatusToStringMode::kWithEverything), EXPECT_THAT(status.ToString(absl::StatusToStringMode::kWithEverything),
AllOf(HasSubstr("INTERNAL: fail"), HasSubstr("[foo='bar']"), AllOf(HasSubstr("INTERNAL: fail"), HasSubstr("[foo='bar']"),
HasSubstr("[bar='\\xff']"))); HasSubstr("[bar='\\xff']")));
EXPECT_THAT(s.ToString(~absl::StatusToStringMode::kWithPayload), EXPECT_THAT(status.ToString(~absl::StatusToStringMode::kWithPayload),
AllOf(HasSubstr("INTERNAL: fail"), Not(HasSubstr("[foo='bar']")), AllOf(HasSubstr("INTERNAL: fail"), Not(HasSubstr("[foo='bar']")),
Not(HasSubstr("[bar='\\xff']")))); Not(HasSubstr("[bar='\\xff']"))));
} }
TEST(Status, OstreamOperator) {
absl::Status status(absl::StatusCode::kInternal, "fail");
{ std::stringstream stream;
stream << status;
EXPECT_EQ("INTERNAL: fail", stream.str());
}
status.SetPayload("foo", absl::Cord("bar"));
{ std::stringstream stream;
stream << status;
EXPECT_EQ("INTERNAL: fail [foo='bar']", stream.str());
}
status.SetPayload("bar", absl::Cord("\377"));
{ std::stringstream stream;
stream << status;
EXPECT_THAT(stream.str(),
AllOf(HasSubstr("INTERNAL: fail"), HasSubstr("[foo='bar']"),
HasSubstr("[bar='\\xff']")));
}
}
TEST(Status, AbslStringify) {
absl::Status status(absl::StatusCode::kInternal, "fail");
EXPECT_EQ("INTERNAL: fail", absl::StrCat(status));
EXPECT_EQ("INTERNAL: fail", absl::StrFormat("%v", status));
status.SetPayload("foo", absl::Cord("bar"));
EXPECT_EQ("INTERNAL: fail [foo='bar']", absl::StrCat(status));
status.SetPayload("bar", absl::Cord("\377"));
EXPECT_THAT(absl::StrCat(status),
AllOf(HasSubstr("INTERNAL: fail"), HasSubstr("[foo='bar']"),
HasSubstr("[bar='\\xff']")));
}
TEST(Status, OstreamEqStringify) {
absl::Status status(absl::StatusCode::kUnknown, "fail");
status.SetPayload("foo", absl::Cord("bar"));
std::stringstream stream;
stream << status;
EXPECT_EQ(stream.str(), absl::StrCat(status));
}
absl::Status EraseAndReturn(const absl::Status& base) { absl::Status EraseAndReturn(const absl::Status& base) {
absl::Status copy = base; absl::Status copy = base;
EXPECT_TRUE(copy.ErasePayload(kUrl1)); EXPECT_TRUE(copy.ErasePayload(kUrl1));
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment