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