Merge pull request #4812 from htuch/fix-any-case

protostream_objectsource: preserve print options across Any.
pull/4815/head
Feng Xiao 7 years ago committed by GitHub
commit f35669b8d3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 7
      src/google/protobuf/util/internal/protostream_objectsource.cc
  2. 78
      src/google/protobuf/util/internal/protostream_objectsource_test.cc
  3. 3
      src/google/protobuf/util/internal/testdata/books.proto

@ -648,6 +648,13 @@ Status ProtoStreamObjectSource::RenderAny(const ProtoStreamObjectSource* os,
// using a nested ProtoStreamObjectSource using our nested type information. // using a nested ProtoStreamObjectSource using our nested type information.
ProtoStreamObjectSource nested_os(&in_stream, os->typeinfo_, *nested_type); ProtoStreamObjectSource nested_os(&in_stream, os->typeinfo_, *nested_type);
// TODO(htuch): This is somewhat fragile, since new options may be omitted.
// We should probably do this via the constructor or some object grouping
// options.
nested_os.set_use_lower_camel_for_enums(os->use_lower_camel_for_enums_);
nested_os.set_use_ints_for_enums(os->use_ints_for_enums_);
nested_os.set_preserve_proto_field_names(os->preserve_proto_field_names_);
// We manually call start and end object here so we can inject the @type. // We manually call start and end object here so we can inject the @type.
ow->StartObject(field_name); ow->StartObject(field_name);
ow->RenderString("@type", type_url); ow->RenderString("@type", type_url);

@ -100,6 +100,7 @@ class ProtostreamObjectSourceTest
ow_(&mock_), ow_(&mock_),
use_lower_camel_for_enums_(false), use_lower_camel_for_enums_(false),
use_ints_for_enums_(false), use_ints_for_enums_(false),
use_preserve_proto_field_names_(false),
add_trailing_zeros_(false), add_trailing_zeros_(false),
render_unknown_enum_values_(true) { render_unknown_enum_values_(true) {
helper_.ResetTypeInfo(Book::descriptor(), Proto3Message::descriptor()); helper_.ResetTypeInfo(Book::descriptor(), Proto3Message::descriptor());
@ -123,6 +124,7 @@ class ProtostreamObjectSourceTest
helper_.NewProtoSource(&in_stream, GetTypeUrl(descriptor))); helper_.NewProtoSource(&in_stream, GetTypeUrl(descriptor)));
if (use_lower_camel_for_enums_) os->set_use_lower_camel_for_enums(true); if (use_lower_camel_for_enums_) os->set_use_lower_camel_for_enums(true);
if (use_ints_for_enums_) os->set_use_ints_for_enums(true); if (use_ints_for_enums_) os->set_use_ints_for_enums(true);
if (use_preserve_proto_field_names_) os->set_preserve_proto_field_names(true);
os->set_max_recursion_depth(64); os->set_max_recursion_depth(64);
return os->WriteTo(&mock_); return os->WriteTo(&mock_);
} }
@ -272,6 +274,8 @@ class ProtostreamObjectSourceTest
void UseIntsForEnums() { use_ints_for_enums_ = true; } void UseIntsForEnums() { use_ints_for_enums_ = true; }
void UsePreserveProtoFieldNames() { use_preserve_proto_field_names_ = true; }
void AddTrailingZeros() { add_trailing_zeros_ = true; } void AddTrailingZeros() { add_trailing_zeros_ = true; }
void SetRenderUnknownEnumValues(bool value) { void SetRenderUnknownEnumValues(bool value) {
@ -284,6 +288,7 @@ class ProtostreamObjectSourceTest
ExpectingObjectWriter ow_; ExpectingObjectWriter ow_;
bool use_lower_camel_for_enums_; bool use_lower_camel_for_enums_;
bool use_ints_for_enums_; bool use_ints_for_enums_;
bool use_preserve_proto_field_names_;
bool add_trailing_zeros_; bool add_trailing_zeros_;
bool render_unknown_enum_values_; bool render_unknown_enum_values_;
}; };
@ -536,6 +541,16 @@ TEST_P(ProtostreamObjectSourceTest, UseIntsForEnumsTest) {
DoTest(book, Book::descriptor()); DoTest(book, Book::descriptor());
} }
TEST_P(ProtostreamObjectSourceTest, UsePreserveProtoFieldNames) {
Book book;
book.set_snake_field("foo");
UsePreserveProtoFieldNames();
ow_.StartObject("")->RenderString("snake_field", "foo")->EndObject();
DoTest(book, Book::descriptor());
}
TEST_P(ProtostreamObjectSourceTest, TEST_P(ProtostreamObjectSourceTest,
UnknownEnumAreDroppedWhenRenderUnknownEnumValuesIsUnset) { UnknownEnumAreDroppedWhenRenderUnknownEnumValuesIsUnset) {
Proto3Message message; Proto3Message message;
@ -769,6 +784,69 @@ TEST_P(ProtostreamObjectSourceAnysTest, BasicAny) {
DoTest(out, AnyOut::descriptor()); DoTest(out, AnyOut::descriptor());
} }
TEST_P(ProtostreamObjectSourceAnysTest, LowerCamelEnumOutputSnakeCase) {
AnyOut out;
::google::protobuf::Any* any = out.mutable_any();
Book book;
book.set_type(Book::arts_and_photography);
any->PackFrom(book);
UseLowerCamelForEnums();
ow_.StartObject("")
->StartObject("any")
->RenderString("@type",
"type.googleapis.com/google.protobuf.testing.Book")
->RenderString("type", "artsAndPhotography")
->EndObject()
->EndObject();
DoTest(out, AnyOut::descriptor());
}
TEST_P(ProtostreamObjectSourceAnysTest, UseIntsForEnumsTest) {
AnyOut out;
::google::protobuf::Any* any = out.mutable_any();
Book book;
book.set_type(Book::ACTION_AND_ADVENTURE);
any->PackFrom(book);
UseIntsForEnums();
ow_.StartObject("")
->StartObject("any")
->RenderString("@type",
"type.googleapis.com/google.protobuf.testing.Book")
->RenderInt32("type", 3)
->EndObject()
->EndObject();
DoTest(out, AnyOut::descriptor());
}
TEST_P(ProtostreamObjectSourceAnysTest, UsePreserveProtoFieldNames) {
AnyOut out;
::google::protobuf::Any* any = out.mutable_any();
Book book;
book.set_snake_field("foo");
any->PackFrom(book);
UsePreserveProtoFieldNames();
ow_.StartObject("")
->StartObject("any")
->RenderString("@type",
"type.googleapis.com/google.protobuf.testing.Book")
->RenderString("snake_field", "foo")
->EndObject()
->EndObject();
DoTest(out, AnyOut::descriptor());
}
TEST_P(ProtostreamObjectSourceAnysTest, RecursiveAny) { TEST_P(ProtostreamObjectSourceAnysTest, RecursiveAny) {
AnyOut out; AnyOut out;
::google::protobuf::Any* any = out.mutable_any(); ::google::protobuf::Any* any = out.mutable_any();

@ -69,6 +69,9 @@ message Book {
} }
optional Type type = 11; optional Type type = 11;
// Useful for testing JSON snake/camel-case conversions.
optional string snake_field = 12;
extensions 200 to 499; extensions 200 to 499;
} }

Loading…
Cancel
Save