status_helper_test.cc 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. //
  2. // Copyright 2021 the gRPC authors.
  3. //
  4. // Licensed under the Apache License, Version 2.0 (the "License");
  5. // you may not use this file except in compliance with the License.
  6. // You may obtain a copy of the License at
  7. //
  8. // http://www.apache.org/licenses/LICENSE-2.0
  9. //
  10. // Unless required by applicable law or agreed to in writing, software
  11. // distributed under the License is distributed on an "AS IS" BASIS,
  12. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. // See the License for the specific language governing permissions and
  14. // limitations under the License.
  15. //
  16. #include "src/core/lib/gprpp/status_helper.h"
  17. #include <gmock/gmock.h>
  18. #include <gtest/gtest.h>
  19. #include "absl/status/status.h"
  20. #include "absl/strings/str_cat.h"
  21. #include "absl/time/clock.h"
  22. #include "google/rpc/status.upb.h"
  23. #include "upb/upb.hpp"
  24. namespace grpc_core {
  25. namespace {
  26. TEST(StatusUtilTest, CreateStatus) {
  27. absl::Status s =
  28. StatusCreate(absl::StatusCode::kUnknown, "Test", DEBUG_LOCATION,
  29. {absl::OkStatus(), absl::CancelledError()});
  30. EXPECT_EQ(absl::StatusCode::kUnknown, s.code());
  31. EXPECT_EQ("Test", s.message());
  32. #ifndef NDEBUG
  33. EXPECT_EQ(true, StatusGetStr(s, StatusStrProperty::kFile).has_value());
  34. EXPECT_EQ(true, StatusGetInt(s, StatusIntProperty::kFileLine).has_value());
  35. #endif
  36. EXPECT_EQ(true, StatusGetTime(s, StatusTimeProperty::kCreated).has_value());
  37. EXPECT_THAT(StatusGetChildren(s),
  38. ::testing::ElementsAre(absl::CancelledError()));
  39. }
  40. TEST(StatusUtilTest, SetAndGetInt) {
  41. absl::Status s = absl::CancelledError();
  42. StatusSetInt(&s, StatusIntProperty::kErrorNo, 2021);
  43. EXPECT_EQ(2021, StatusGetInt(s, StatusIntProperty::kErrorNo));
  44. }
  45. TEST(StatusUtilTest, GetIntNotExistent) {
  46. absl::Status s = absl::CancelledError();
  47. EXPECT_EQ(absl::optional<intptr_t>(),
  48. StatusGetInt(s, StatusIntProperty::kErrorNo));
  49. }
  50. TEST(StatusUtilTest, SetAndGetStr) {
  51. absl::Status s = absl::CancelledError();
  52. StatusSetStr(&s, StatusStrProperty::kOsError, "value");
  53. EXPECT_EQ("value", StatusGetStr(s, StatusStrProperty::kOsError));
  54. }
  55. TEST(StatusUtilTest, GetStrNotExistent) {
  56. absl::Status s = absl::CancelledError();
  57. EXPECT_EQ(absl::optional<std::string>(),
  58. StatusGetStr(s, StatusStrProperty::kOsError));
  59. }
  60. TEST(StatusUtilTest, SetAndGetTime) {
  61. absl::Status s = absl::CancelledError();
  62. absl::Time t = absl::Now();
  63. StatusSetTime(&s, StatusTimeProperty::kCreated, t);
  64. EXPECT_EQ(t, StatusGetTime(s, StatusTimeProperty::kCreated));
  65. }
  66. TEST(StatusUtilTest, GetTimeNotExistent) {
  67. absl::Status s = absl::CancelledError();
  68. EXPECT_EQ(absl::optional<absl::Time>(),
  69. StatusGetTime(s, StatusTimeProperty::kCreated));
  70. }
  71. TEST(StatusUtilTest, AddAndGetChildren) {
  72. absl::Status s = absl::CancelledError();
  73. absl::Status child1 = absl::AbortedError("Message1");
  74. absl::Status child2 = absl::DeadlineExceededError("Message2");
  75. StatusAddChild(&s, child1);
  76. StatusAddChild(&s, child2);
  77. EXPECT_THAT(StatusGetChildren(s), ::testing::ElementsAre(child1, child2));
  78. }
  79. TEST(StatusUtilTest, ToAndFromProto) {
  80. absl::Status s = absl::CancelledError("Message");
  81. StatusSetInt(&s, StatusIntProperty::kErrorNo, 2021);
  82. StatusSetStr(&s, StatusStrProperty::kOsError, "value");
  83. upb::Arena arena;
  84. google_rpc_Status* msg = internal::StatusToProto(s, arena.ptr());
  85. absl::Status s2 = internal::StatusFromProto(msg);
  86. EXPECT_EQ(s, s2);
  87. }
  88. TEST(StatusUtilTest, OkToString) {
  89. absl::Status s = absl::OkStatus();
  90. std::string t = StatusToString(s);
  91. EXPECT_EQ("OK", t);
  92. }
  93. TEST(StatusUtilTest, CancelledErrorToString) {
  94. absl::Status s = absl::CancelledError();
  95. std::string t = StatusToString(s);
  96. EXPECT_EQ("CANCELLED", t);
  97. }
  98. TEST(StatusUtilTest, ErrorWithIntPropertyToString) {
  99. absl::Status s = absl::CancelledError("Message");
  100. StatusSetInt(&s, StatusIntProperty::kErrorNo, 2021);
  101. std::string t = StatusToString(s);
  102. EXPECT_EQ("CANCELLED:Message {errno:2021}", t);
  103. }
  104. TEST(StatusUtilTest, ErrorWithStrPropertyToString) {
  105. absl::Status s = absl::CancelledError("Message");
  106. StatusSetStr(&s, StatusStrProperty::kDescription, "Hey");
  107. std::string t = StatusToString(s);
  108. EXPECT_EQ("CANCELLED:Message {description:\"Hey\"}", t);
  109. }
  110. TEST(StatusUtilTest, ErrorWithTimePropertyToString) {
  111. absl::Status s = absl::CancelledError("Message");
  112. absl::Time t = absl::FromCivil(absl::CivilSecond(2021, 4, 29, 8, 56, 30),
  113. absl::LocalTimeZone());
  114. StatusSetTime(&s, StatusTimeProperty::kCreated, t);
  115. EXPECT_EQ(StatusToString(s),
  116. absl::StrCat("CANCELLED:Message {created_time:\"",
  117. absl::FormatTime(t), "\"}"));
  118. }
  119. TEST(StatusUtilTest, ComplexErrorWithChildrenToString) {
  120. absl::Status s = absl::CancelledError("Message");
  121. StatusSetInt(&s, StatusIntProperty::kErrorNo, 2021);
  122. absl::Status s1 = absl::AbortedError("Message1");
  123. StatusAddChild(&s, s1);
  124. absl::Status s2 = absl::AlreadyExistsError("Message2");
  125. StatusSetStr(&s2, StatusStrProperty::kOsError, "value");
  126. StatusAddChild(&s, s2);
  127. std::string t = StatusToString(s);
  128. EXPECT_EQ(
  129. "CANCELLED:Message {errno:2021, children:["
  130. "ABORTED:Message1, ALREADY_EXISTS:Message2 {os_error:\"value\"}]}",
  131. t);
  132. }
  133. TEST(StatusUtilTest, AllocHeapPtr) {
  134. absl::Status statuses[] = {absl::OkStatus(), absl::CancelledError(),
  135. absl::AbortedError("Message")};
  136. for (const auto& s : statuses) {
  137. uintptr_t p = internal::StatusAllocHeapPtr(s);
  138. EXPECT_EQ(s, internal::StatusGetFromHeapPtr(p));
  139. internal::StatusFreeHeapPtr(p);
  140. }
  141. }
  142. TEST(StatusUtilTest, MoveHeapPtr) {
  143. absl::Status statuses[] = {absl::OkStatus(), absl::CancelledError(),
  144. absl::AbortedError("Message")};
  145. for (const auto& s : statuses) {
  146. uintptr_t p = internal::StatusAllocHeapPtr(s);
  147. EXPECT_EQ(s, internal::StatusMoveFromHeapPtr(p));
  148. }
  149. }
  150. } // namespace
  151. } // namespace grpc_core
  152. int main(int argc, char** argv) {
  153. ::testing::InitGoogleTest(&argc, argv);
  154. int ret = RUN_ALL_TESTS();
  155. return ret;
  156. }