1 //
2 //
3 // Copyright 2017 gRPC authors.
4 //
5 // Licensed under the Apache License, Version 2.0 (the "License");
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
8 //
9 // http://www.apache.org/licenses/LICENSE-2.0
10 //
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
16 //
17 //
18
19 #include <grpcpp/support/error_details.h>
20 #include <gtest/gtest.h>
21
22 #include "google/rpc/status.pb.h"
23 #include "src/proto/grpc/testing/echo_messages.pb.h"
24 #include "test/core/test_util/test_config.h"
25
26 namespace grpc {
27 namespace {
28
TEST(ExtractTest,Success)29 TEST(ExtractTest, Success) {
30 google::rpc::Status expected;
31 expected.set_code(13); // INTERNAL
32 expected.set_message("I am an error message");
33 testing::EchoRequest expected_details;
34 expected_details.set_message(std::string(100, '\0'));
35 expected.add_details()->PackFrom(expected_details);
36
37 google::rpc::Status to;
38 std::string error_details = expected.SerializeAsString();
39 Status from(static_cast<StatusCode>(expected.code()), expected.message(),
40 error_details);
41 EXPECT_TRUE(ExtractErrorDetails(from, &to).ok());
42 EXPECT_EQ(expected.code(), to.code());
43 EXPECT_EQ(expected.message(), to.message());
44 EXPECT_EQ(1, to.details_size());
45 testing::EchoRequest details;
46 to.details(0).UnpackTo(&details);
47 EXPECT_EQ(expected_details.message(), details.message());
48 }
49
TEST(ExtractTest,NullInput)50 TEST(ExtractTest, NullInput) {
51 EXPECT_EQ(StatusCode::FAILED_PRECONDITION,
52 ExtractErrorDetails(Status(), nullptr).error_code());
53 }
54
TEST(ExtractTest,Unparsable)55 TEST(ExtractTest, Unparsable) {
56 std::string error_details("I am not a status object");
57 Status from(StatusCode::INTERNAL, "", error_details);
58 google::rpc::Status to;
59 EXPECT_EQ(StatusCode::INVALID_ARGUMENT,
60 ExtractErrorDetails(from, &to).error_code());
61 }
62
TEST(SetTest,Success)63 TEST(SetTest, Success) {
64 google::rpc::Status expected;
65 expected.set_code(13); // INTERNAL
66 expected.set_message("I am an error message");
67 testing::EchoRequest expected_details;
68 expected_details.set_message(std::string(100, '\0'));
69 expected.add_details()->PackFrom(expected_details);
70
71 Status to;
72 Status s = SetErrorDetails(expected, &to);
73 EXPECT_TRUE(s.ok());
74 EXPECT_EQ(expected.code(), to.error_code());
75 EXPECT_EQ(expected.message(), to.error_message());
76 EXPECT_EQ(expected.SerializeAsString(), to.error_details());
77 }
78
TEST(SetTest,NullInput)79 TEST(SetTest, NullInput) {
80 EXPECT_EQ(StatusCode::FAILED_PRECONDITION,
81 SetErrorDetails(google::rpc::Status(), nullptr).error_code());
82 }
83
TEST(SetTest,OutOfScopeErrorCode)84 TEST(SetTest, OutOfScopeErrorCode) {
85 google::rpc::Status expected;
86 expected.set_code(17); // Out of scope (UNAUTHENTICATED is 16).
87 expected.set_message("I am an error message");
88 testing::EchoRequest expected_details;
89 expected_details.set_message(std::string(100, '\0'));
90 expected.add_details()->PackFrom(expected_details);
91
92 Status to;
93 Status s = SetErrorDetails(expected, &to);
94 EXPECT_TRUE(s.ok());
95 EXPECT_EQ(StatusCode::UNKNOWN, to.error_code());
96 EXPECT_EQ(expected.message(), to.error_message());
97 EXPECT_EQ(expected.SerializeAsString(), to.error_details());
98 }
99
TEST(SetTest,ValidScopeErrorCode)100 TEST(SetTest, ValidScopeErrorCode) {
101 for (int c = StatusCode::CANCELLED; c <= StatusCode::UNAUTHENTICATED; c++) {
102 google::rpc::Status expected;
103 expected.set_code(c);
104 expected.set_message("I am an error message");
105 testing::EchoRequest expected_details;
106 expected_details.set_message(std::string(100, '\0'));
107 expected.add_details()->PackFrom(expected_details);
108
109 Status to;
110 Status s = SetErrorDetails(expected, &to);
111 EXPECT_TRUE(s.ok());
112 EXPECT_EQ(c, to.error_code());
113 EXPECT_EQ(expected.message(), to.error_message());
114 EXPECT_EQ(expected.SerializeAsString(), to.error_details());
115 }
116 }
117
118 } // namespace
119 } // namespace grpc
120
main(int argc,char ** argv)121 int main(int argc, char** argv) {
122 grpc::testing::TestEnvironment env(&argc, argv);
123 ::testing::InitGoogleTest(&argc, argv);
124 return RUN_ALL_TESTS();
125 }
126