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