• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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