aboutsummaryrefslogtreecommitdiffhomepage
path: root/test/cpp/util/proto_file_parser.cc
diff options
context:
space:
mode:
Diffstat (limited to 'test/cpp/util/proto_file_parser.cc')
-rw-r--r--test/cpp/util/proto_file_parser.cc81
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;