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