1 // Copyright 2019 Google LLC
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14
15 #include "google/cloud/grpc_error_delegate.h"
16 #include <gtest/gtest.h>
17
18 namespace google {
19 namespace cloud {
20 inline namespace GOOGLE_CLOUD_CPP_NS {
21 namespace {
22
TEST(MakeStatusFromRpcError,AllCodes)23 TEST(MakeStatusFromRpcError, AllCodes) {
24 using google::cloud::StatusCode;
25
26 struct {
27 grpc::StatusCode grpc;
28 StatusCode expected;
29 } expected_codes[]{
30 {grpc::StatusCode::OK, StatusCode::kOk},
31 {grpc::StatusCode::CANCELLED, StatusCode::kCancelled},
32 {grpc::StatusCode::UNKNOWN, StatusCode::kUnknown},
33 {grpc::StatusCode::INVALID_ARGUMENT, StatusCode::kInvalidArgument},
34 {grpc::StatusCode::DEADLINE_EXCEEDED, StatusCode::kDeadlineExceeded},
35 {grpc::StatusCode::NOT_FOUND, StatusCode::kNotFound},
36 {grpc::StatusCode::ALREADY_EXISTS, StatusCode::kAlreadyExists},
37 {grpc::StatusCode::PERMISSION_DENIED, StatusCode::kPermissionDenied},
38 {grpc::StatusCode::UNAUTHENTICATED, StatusCode::kUnauthenticated},
39 {grpc::StatusCode::RESOURCE_EXHAUSTED, StatusCode::kResourceExhausted},
40 {grpc::StatusCode::FAILED_PRECONDITION, StatusCode::kFailedPrecondition},
41 {grpc::StatusCode::ABORTED, StatusCode::kAborted},
42 {grpc::StatusCode::OUT_OF_RANGE, StatusCode::kOutOfRange},
43 {grpc::StatusCode::UNIMPLEMENTED, StatusCode::kUnimplemented},
44 {grpc::StatusCode::INTERNAL, StatusCode::kInternal},
45 {grpc::StatusCode::UNAVAILABLE, StatusCode::kUnavailable},
46 {grpc::StatusCode::DATA_LOSS, StatusCode::kDataLoss},
47 };
48
49 for (auto const& codes : expected_codes) {
50 std::string const message = "test message";
51 auto const original = grpc::Status(codes.grpc, message);
52 auto const expected = google::cloud::Status(codes.expected, message);
53 auto const actual = MakeStatusFromRpcError(original);
54 EXPECT_EQ(expected, actual);
55 }
56 }
57
TEST(MakeStatusFromRpcError,ProtoValidCode)58 TEST(MakeStatusFromRpcError, ProtoValidCode) {
59 using google::cloud::StatusCode;
60
61 struct {
62 grpc::StatusCode grpc;
63 StatusCode expected;
64 } expected_codes[]{
65 {grpc::StatusCode::OK, StatusCode::kOk},
66 {grpc::StatusCode::CANCELLED, StatusCode::kCancelled},
67 {grpc::StatusCode::UNKNOWN, StatusCode::kUnknown},
68 {grpc::StatusCode::INVALID_ARGUMENT, StatusCode::kInvalidArgument},
69 {grpc::StatusCode::DEADLINE_EXCEEDED, StatusCode::kDeadlineExceeded},
70 {grpc::StatusCode::NOT_FOUND, StatusCode::kNotFound},
71 {grpc::StatusCode::ALREADY_EXISTS, StatusCode::kAlreadyExists},
72 {grpc::StatusCode::PERMISSION_DENIED, StatusCode::kPermissionDenied},
73 {grpc::StatusCode::UNAUTHENTICATED, StatusCode::kUnauthenticated},
74 {grpc::StatusCode::RESOURCE_EXHAUSTED, StatusCode::kResourceExhausted},
75 {grpc::StatusCode::FAILED_PRECONDITION, StatusCode::kFailedPrecondition},
76 {grpc::StatusCode::ABORTED, StatusCode::kAborted},
77 {grpc::StatusCode::OUT_OF_RANGE, StatusCode::kOutOfRange},
78 {grpc::StatusCode::UNIMPLEMENTED, StatusCode::kUnimplemented},
79 {grpc::StatusCode::INTERNAL, StatusCode::kInternal},
80 {grpc::StatusCode::UNAVAILABLE, StatusCode::kUnavailable},
81 {grpc::StatusCode::DATA_LOSS, StatusCode::kDataLoss},
82 };
83
84 for (auto const& codes : expected_codes) {
85 std::string const message = "test message";
86 google::rpc::Status original;
87 original.set_message(message);
88 original.set_code(codes.grpc);
89 auto const expected = google::cloud::Status(codes.expected, message);
90 auto const actual = MakeStatusFromRpcError(original);
91 EXPECT_EQ(expected, actual);
92 }
93 }
94
TEST(MakeStatusFromRpcError,ProtoInvalidCode)95 TEST(MakeStatusFromRpcError, ProtoInvalidCode) {
96 using google::cloud::StatusCode;
97
98 for (auto const& code : {-100, -1, 30, 100}) {
99 std::string const message = "test message";
100 google::rpc::Status original;
101 original.set_message(message);
102 original.set_code(code);
103 auto const expected = google::cloud::Status(StatusCode::kUnknown, message);
104 auto const actual = MakeStatusFromRpcError(original);
105 EXPECT_EQ(expected, actual);
106 }
107 }
108
109 } // namespace
110 } // namespace GOOGLE_CLOUD_CPP_NS
111 } // namespace cloud
112 } // namespace google
113