diff options
Diffstat (limited to 'test/cpp/util/proto_file_parser.cc')
-rw-r--r-- | test/cpp/util/proto_file_parser.cc | 81 |
1 files changed, 78 insertions, 3 deletions
diff --git a/test/cpp/util/proto_file_parser.cc b/test/cpp/util/proto_file_parser.cc index a530ed1ffc..997808cbc3 100644 --- a/test/cpp/util/proto_file_parser.cc +++ b/test/cpp/util/proto_file_parser.cc @@ -216,7 +216,7 @@ bool ProtoFileParser::IsStreaming(const grpc::string& method, bool is_request) { : method_desc->server_streaming(); } -grpc::string ProtoFileParser::GetSerializedProtoFromMethod( +grpc::string ProtoFileParser::GetSerializedProtoFromMethodTextFormat( const grpc::string& method, const grpc::string& text_format_proto, bool is_request) { has_error_ = false; @@ -224,10 +224,22 @@ grpc::string ProtoFileParser::GetSerializedProtoFromMethod( if (has_error_) { return ""; } - return GetSerializedProtoFromMessageType(message_type_name, + return GetSerializedProtoFromMessageTypeTextFormat(message_type_name, text_format_proto); } +grpc::string ProtoFileParser::GetSerializedProtoFromMethodJsonFormat( + const grpc::string& method, const grpc::string& json_format_proto, + bool is_request) { + has_error_ = false; + grpc::string message_type_name = GetMessageTypeFromMethod(method, is_request); + if (has_error_) { + return ""; + } + return GetSerializedProtoFromMessageTypeJsonFormat(message_type_name, + json_format_proto); +} + grpc::string ProtoFileParser::GetTextFormatFromMethod( const grpc::string& method, const grpc::string& serialized_proto, bool is_request) { @@ -239,7 +251,18 @@ grpc::string ProtoFileParser::GetTextFormatFromMethod( return GetTextFormatFromMessageType(message_type_name, serialized_proto); } -grpc::string ProtoFileParser::GetSerializedProtoFromMessageType( +grpc::string ProtoFileParser::GetJsonFormatFromMethod( + const grpc::string& method, const grpc::string& serialized_proto, + bool is_request) { + has_error_ = false; + grpc::string message_type_name = GetMessageTypeFromMethod(method, is_request); + if (has_error_) { + return ""; + } + return GetJsonFormatFromMessageType(message_type_name, serialized_proto); +} + +grpc::string ProtoFileParser::GetSerializedProtoFromMessageTypeTextFormat( const grpc::string& message_type_name, const grpc::string& text_format_proto) { has_error_ = false; @@ -265,6 +288,32 @@ grpc::string ProtoFileParser::GetSerializedProtoFromMessageType( return serialized; } +grpc::string ProtoFileParser::GetSerializedProtoFromMessageTypeJsonFormat( + const grpc::string& message_type_name, + const grpc::string& json_format_proto) { + has_error_ = false; + grpc::string serialized; + const protobuf::Descriptor* desc = + desc_pool_->FindMessageTypeByName(message_type_name); + if (!desc) { + LogError("Message type not found"); + return ""; + } + std::unique_ptr<grpc::protobuf::Message> msg( + dynamic_factory_->GetPrototype(desc)->New()); + + if (!grpc::protobuf::json::JsonStringToMessage(json_format_proto, msg.get()).ok()) { + LogError("Failed to parse json format to proto."); + return ""; + } + bool ok = msg->SerializeToString(&serialized); + if (!ok) { + LogError("Failed to serialize proto."); + return ""; + } + return serialized; +} + grpc::string ProtoFileParser::GetTextFormatFromMessageType( const grpc::string& message_type_name, const grpc::string& serialized_proto) { @@ -289,6 +338,32 @@ grpc::string ProtoFileParser::GetTextFormatFromMessageType( return text_format; } +grpc::string ProtoFileParser::GetJsonFormatFromMessageType( + const grpc::string& message_type_name, + const grpc::string& serialized_proto) { + has_error_ = false; + const protobuf::Descriptor* desc = + desc_pool_->FindMessageTypeByName(message_type_name); + if (!desc) { + LogError("Message type not found"); + return ""; + } + std::unique_ptr<grpc::protobuf::Message> msg( + dynamic_factory_->GetPrototype(desc)->New()); + if (!msg->ParseFromString(serialized_proto)) { + LogError("Failed to deserialize proto."); + return ""; + } + grpc::string json_format; + grpc::protobuf::json::JsonPrintOptions jsonPrintOptions; + jsonPrintOptions.add_whitespace = true; + if (!grpc::protobuf::json::MessageToJsonString(*msg.get(), &json_format, jsonPrintOptions).ok()) { + LogError("Failed to print proto message to json format"); + return ""; + } + return json_format; +} + void ProtoFileParser::LogError(const grpc::string& error_msg) { if (!error_msg.empty()) { std::cerr << error_msg << std::endl; |