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 <gtest/gtest.h>
20
21 #include <grpcpp/support/error_details.h>
22
23 #include "src/proto/grpc/status/status.pb.h"
24 #include "src/proto/grpc/testing/echo_messages.pb.h"
25 #include "test/core/util/test_config.h"
26
27 namespace grpc {
28 namespace {
29
TEST(ExtractTest,Success)30 TEST(ExtractTest, Success) {
31 google::rpc::Status expected;
32 expected.set_code(13); // INTERNAL
33 expected.set_message("I am an error message");
34 testing::EchoRequest expected_details;
35 expected_details.set_message(std::string(100, '\0'));
36 expected.add_details()->PackFrom(expected_details);
37
38 google::rpc::Status to;
39 std::string error_details = expected.SerializeAsString();
40 Status from(static_cast<StatusCode>(expected.code()), expected.message(),
41 error_details);
42 EXPECT_TRUE(ExtractErrorDetails(from, &to).ok());
43 EXPECT_EQ(expected.code(), to.code());
44 EXPECT_EQ(expected.message(), to.message());
45 EXPECT_EQ(1, to.details_size());
46 testing::EchoRequest details;
47 to.details(0).UnpackTo(&details);
48 EXPECT_EQ(expected_details.message(), details.message());
49 }
50
TEST(ExtractTest,NullInput)51 TEST(ExtractTest, NullInput) {
52 EXPECT_EQ(StatusCode::FAILED_PRECONDITION,
53 ExtractErrorDetails(Status(), nullptr).error_code());
54 }
55
TEST(ExtractTest,Unparsable)56 TEST(ExtractTest, Unparsable) {
57 std::string error_details("I am not a status object");
58 Status from(StatusCode::INTERNAL, "", error_details);
59 google::rpc::Status to;
60 EXPECT_EQ(StatusCode::INVALID_ARGUMENT,
61 ExtractErrorDetails(from, &to).error_code());
62 }
63
TEST(SetTest,Success)64 TEST(SetTest, Success) {
65 google::rpc::Status expected;
66 expected.set_code(13); // INTERNAL
67 expected.set_message("I am an error message");
68 testing::EchoRequest expected_details;
69 expected_details.set_message(std::string(100, '\0'));
70 expected.add_details()->PackFrom(expected_details);
71
72 Status to;
73 Status s = SetErrorDetails(expected, &to);
74 EXPECT_TRUE(s.ok());
75 EXPECT_EQ(expected.code(), to.error_code());
76 EXPECT_EQ(expected.message(), to.error_message());
77 EXPECT_EQ(expected.SerializeAsString(), to.error_details());
78 }
79
TEST(SetTest,NullInput)80 TEST(SetTest, NullInput) {
81 EXPECT_EQ(StatusCode::FAILED_PRECONDITION,
82 SetErrorDetails(google::rpc::Status(), nullptr).error_code());
83 }
84
TEST(SetTest,OutOfScopeErrorCode)85 TEST(SetTest, OutOfScopeErrorCode) {
86 google::rpc::Status expected;
87 expected.set_code(17); // Out of scope (UNAUTHENTICATED is 16).
88 expected.set_message("I am an error message");
89 testing::EchoRequest expected_details;
90 expected_details.set_message(std::string(100, '\0'));
91 expected.add_details()->PackFrom(expected_details);
92
93 Status to;
94 Status s = SetErrorDetails(expected, &to);
95 EXPECT_TRUE(s.ok());
96 EXPECT_EQ(StatusCode::UNKNOWN, to.error_code());
97 EXPECT_EQ(expected.message(), to.error_message());
98 EXPECT_EQ(expected.SerializeAsString(), to.error_details());
99 }
100
TEST(SetTest,ValidScopeErrorCode)101 TEST(SetTest, ValidScopeErrorCode) {
102 for (int c = StatusCode::OK; c <= StatusCode::UNAUTHENTICATED; c++) {
103 google::rpc::Status expected;
104 expected.set_code(c);
105 expected.set_message("I am an error message");
106 testing::EchoRequest expected_details;
107 expected_details.set_message(std::string(100, '\0'));
108 expected.add_details()->PackFrom(expected_details);
109
110 Status to;
111 Status s = SetErrorDetails(expected, &to);
112 EXPECT_TRUE(s.ok());
113 EXPECT_EQ(c, to.error_code());
114 EXPECT_EQ(expected.message(), to.error_message());
115 EXPECT_EQ(expected.SerializeAsString(), to.error_details());
116 }
117 }
118
119 } // namespace
120 } // namespace grpc
121
main(int argc,char ** argv)122 int main(int argc, char** argv) {
123 grpc::testing::TestEnvironment env(&argc, argv);
124 ::testing::InitGoogleTest(&argc, argv);
125 return RUN_ALL_TESTS();
126 }
127