• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //
2 // Copyright 2021 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 
17 #include "src/core/lib/transport/error_utils.h"
18 
19 #include <stdint.h>
20 
21 #include <vector>
22 
23 #include "absl/status/status.h"
24 #include "gtest/gtest.h"
25 #include "src/core/lib/iomgr/error.h"
26 #include "src/core/util/status_helper.h"
27 #include "test/core/test_util/test_config.h"
28 
29 namespace {
30 
TEST(ErrorUtilsTest,GetErrorGetStatusNone)31 TEST(ErrorUtilsTest, GetErrorGetStatusNone) {
32   grpc_error_handle error;
33   grpc_status_code code;
34   std::string message;
35   grpc_error_get_status(error, grpc_core::Timestamp(), &code, &message, nullptr,
36                         nullptr);
37   ASSERT_EQ(code, GRPC_STATUS_OK);
38   ASSERT_EQ(message, "");
39 }
40 
TEST(ErrorUtilsTest,GetErrorGetStatusFlat)41 TEST(ErrorUtilsTest, GetErrorGetStatusFlat) {
42   grpc_error_handle error = grpc_error_set_int(
43       GRPC_ERROR_CREATE("Msg"), grpc_core::StatusIntProperty::kRpcStatus,
44       GRPC_STATUS_CANCELLED);
45   grpc_status_code code;
46   std::string message;
47   grpc_error_get_status(error, grpc_core::Timestamp(), &code, &message, nullptr,
48                         nullptr);
49   ASSERT_EQ(code, GRPC_STATUS_CANCELLED);
50   ASSERT_EQ(message, "Msg");
51 }
52 
TEST(ErrorUtilsTest,GetErrorGetStatusChild)53 TEST(ErrorUtilsTest, GetErrorGetStatusChild) {
54   std::vector<grpc_error_handle> children = {
55       GRPC_ERROR_CREATE("Child1"),
56       grpc_error_set_int(GRPC_ERROR_CREATE("Child2"),
57                          grpc_core::StatusIntProperty::kRpcStatus,
58                          GRPC_STATUS_RESOURCE_EXHAUSTED),
59   };
60   grpc_error_handle error = GRPC_ERROR_CREATE_FROM_VECTOR("Parent", &children);
61   grpc_status_code code;
62   std::string message;
63   grpc_error_get_status(error, grpc_core::Timestamp(), &code, &message, nullptr,
64                         nullptr);
65   ASSERT_EQ(code, GRPC_STATUS_RESOURCE_EXHAUSTED);
66   ASSERT_EQ(message, "Child2");
67 }
68 
69 // ---- Ok Status ----
TEST(ErrorUtilsTest,AbslOkToGrpcError)70 TEST(ErrorUtilsTest, AbslOkToGrpcError) {
71   grpc_error_handle error = absl_status_to_grpc_error(absl::OkStatus());
72   ASSERT_EQ(absl::OkStatus(), error);
73 }
74 
TEST(ErrorUtilsTest,GrpcSpecialErrorNoneToAbslStatus)75 TEST(ErrorUtilsTest, GrpcSpecialErrorNoneToAbslStatus) {
76   absl::Status status = grpc_error_to_absl_status(absl::OkStatus());
77   ASSERT_TRUE(status.ok());
78   ASSERT_EQ(status.message(), "");
79 }
80 
81 // ---- Asymmetry of conversions of "Special" errors ----
TEST(ErrorUtilsTest,AbslStatusToGrpcErrorDoesNotReturnSpecialVariables)82 TEST(ErrorUtilsTest, AbslStatusToGrpcErrorDoesNotReturnSpecialVariables) {
83   grpc_error_handle error =
84       absl_status_to_grpc_error(absl::CancelledError("CANCELLED"));
85   ASSERT_NE(error, absl::CancelledError());
86 }
87 
TEST(ErrorUtilsTest,GrpcSpecialErrorCancelledToAbslStatus)88 TEST(ErrorUtilsTest, GrpcSpecialErrorCancelledToAbslStatus) {
89   absl::Status status = grpc_error_to_absl_status(absl::CancelledError());
90   ASSERT_TRUE(absl::IsCancelled(status));
91   ASSERT_EQ(status.message(), "CANCELLED");
92 }
93 
TEST(ErrorUtilsTest,GrpcSpecialErrorOOMToAbslStatus)94 TEST(ErrorUtilsTest, GrpcSpecialErrorOOMToAbslStatus) {
95   absl::Status status =
96       grpc_error_to_absl_status(absl::ResourceExhaustedError(""));
97   ASSERT_TRUE(absl::IsResourceExhausted(status));
98   ASSERT_EQ(status.message(), "RESOURCE_EXHAUSTED");
99 }
100 
101 // ---- Ordinary statuses ----
TEST(ErrorUtilsTest,AbslUnavailableToGrpcError)102 TEST(ErrorUtilsTest, AbslUnavailableToGrpcError) {
103   grpc_error_handle error =
104       absl_status_to_grpc_error(absl::UnavailableError("Making tea"));
105   // Status code checks
106   intptr_t code;
107   ASSERT_TRUE(grpc_error_get_int(
108       error, grpc_core::StatusIntProperty::kRpcStatus, &code));
109   ASSERT_EQ(static_cast<grpc_status_code>(code), GRPC_STATUS_UNAVAILABLE);
110   // Status message checks
111   std::string message;
112   ASSERT_TRUE(grpc_error_get_str(
113       error, grpc_core::StatusStrProperty::kDescription, &message));
114   ASSERT_EQ(message, "Making tea");
115 }
116 
TEST(ErrorUtilsTest,GrpcErrorUnavailableToAbslStatus)117 TEST(ErrorUtilsTest, GrpcErrorUnavailableToAbslStatus) {
118   grpc_error_handle error = grpc_error_set_int(
119       GRPC_ERROR_CREATE(
120           "weighted_target: all children report state TRANSIENT_FAILURE"),
121       grpc_core::StatusIntProperty::kRpcStatus, GRPC_STATUS_UNAVAILABLE);
122   absl::Status status = grpc_error_to_absl_status(error);
123   ASSERT_TRUE(absl::IsUnavailable(status));
124   ASSERT_EQ(status.message(),
125             "weighted_target: all children report state TRANSIENT_FAILURE");
126 }
127 
128 }  // namespace
129 
main(int argc,char ** argv)130 int main(int argc, char** argv) {
131   testing::InitGoogleTest(&argc, argv);
132   grpc::testing::TestEnvironment env(&argc, argv);
133   return RUN_ALL_TESTS();
134 };
135