xref: /aosp_15_r20/external/grpc-grpc/test/cpp/util/error_details_test.cc (revision cc02d7e222339f7a4f6ba5f422e6413f4bd931f2)
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