| Index: third_party/protobuf/src/google/protobuf/util/json_util_test.cc
|
| diff --git a/third_party/protobuf/src/google/protobuf/util/json_util_test.cc b/third_party/protobuf/src/google/protobuf/util/json_util_test.cc
|
| index a4d3cc983fe1102a98b7de5b34442eba56fa4036..3ce779c922fd065c50774842101572425af6b703 100644
|
| --- a/third_party/protobuf/src/google/protobuf/util/json_util_test.cc
|
| +++ b/third_party/protobuf/src/google/protobuf/util/json_util_test.cc
|
| @@ -34,6 +34,8 @@
|
| #include <string>
|
|
|
| #include <google/protobuf/io/zero_copy_stream.h>
|
| +#include <google/protobuf/descriptor_database.h>
|
| +#include <google/protobuf/dynamic_message.h>
|
| #include <google/protobuf/util/json_format_proto3.pb.h>
|
| #include <google/protobuf/util/type_resolver.h>
|
| #include <google/protobuf/util/type_resolver_util.h>
|
| @@ -63,26 +65,21 @@ static string GetTypeUrl(const Descriptor* message) {
|
| class JsonUtilTest : public testing::Test {
|
| protected:
|
| JsonUtilTest() {
|
| - resolver_.reset(NewTypeResolverForDescriptorPool(
|
| - kTypeUrlPrefix, DescriptorPool::generated_pool()));
|
| }
|
|
|
| - string ToJson(const Message& message, const JsonOptions& options) {
|
| + string ToJson(const Message& message, const JsonPrintOptions& options) {
|
| string result;
|
| - GOOGLE_CHECK_OK(BinaryToJsonString(resolver_.get(),
|
| - GetTypeUrl(message.GetDescriptor()),
|
| - message.SerializeAsString(), &result, options));
|
| + GOOGLE_CHECK_OK(MessageToJsonString(message, &result, options));
|
| return result;
|
| }
|
|
|
| + bool FromJson(const string& json, Message* message,
|
| + const JsonParseOptions& options) {
|
| + return JsonStringToMessage(json, message, options).ok();
|
| + }
|
| +
|
| bool FromJson(const string& json, Message* message) {
|
| - string binary;
|
| - if (!JsonToBinaryString(resolver_.get(),
|
| - GetTypeUrl(message->GetDescriptor()), json, &binary)
|
| - .ok()) {
|
| - return false;
|
| - }
|
| - return message->ParseFromString(binary);
|
| + return FromJson(json, message, JsonParseOptions());
|
| }
|
|
|
| google::protobuf::scoped_ptr<TypeResolver> resolver_;
|
| @@ -92,7 +89,7 @@ TEST_F(JsonUtilTest, TestWhitespaces) {
|
| TestMessage m;
|
| m.mutable_message_value();
|
|
|
| - JsonOptions options;
|
| + JsonPrintOptions options;
|
| EXPECT_EQ("{\"messageValue\":{}}", ToJson(m, options));
|
| options.add_whitespace = true;
|
| EXPECT_EQ(
|
| @@ -104,7 +101,7 @@ TEST_F(JsonUtilTest, TestWhitespaces) {
|
|
|
| TEST_F(JsonUtilTest, TestDefaultValues) {
|
| TestMessage m;
|
| - JsonOptions options;
|
| + JsonPrintOptions options;
|
| EXPECT_EQ("{}", ToJson(m, options));
|
| options.always_print_primitive_fields = true;
|
| EXPECT_EQ(
|
| @@ -131,6 +128,34 @@ TEST_F(JsonUtilTest, TestDefaultValues) {
|
| "\"repeatedMessageValue\":[]"
|
| "}",
|
| ToJson(m, options));
|
| +
|
| + options.always_print_primitive_fields = true;
|
| + m.set_string_value("i am a test string value");
|
| + m.set_bytes_value("i am a test bytes value");
|
| + EXPECT_EQ(
|
| + "{\"boolValue\":false,"
|
| + "\"int32Value\":0,"
|
| + "\"int64Value\":\"0\","
|
| + "\"uint32Value\":0,"
|
| + "\"uint64Value\":\"0\","
|
| + "\"floatValue\":0,"
|
| + "\"doubleValue\":0,"
|
| + "\"stringValue\":\"i am a test string value\","
|
| + "\"bytesValue\":\"aSBhbSBhIHRlc3QgYnl0ZXMgdmFsdWU=\","
|
| + "\"enumValue\":\"FOO\","
|
| + "\"repeatedBoolValue\":[],"
|
| + "\"repeatedInt32Value\":[],"
|
| + "\"repeatedInt64Value\":[],"
|
| + "\"repeatedUint32Value\":[],"
|
| + "\"repeatedUint64Value\":[],"
|
| + "\"repeatedFloatValue\":[],"
|
| + "\"repeatedDoubleValue\":[],"
|
| + "\"repeatedStringValue\":[],"
|
| + "\"repeatedBytesValue\":[],"
|
| + "\"repeatedEnumValue\":[],"
|
| + "\"repeatedMessageValue\":[]"
|
| + "}",
|
| + ToJson(m, options));
|
| }
|
|
|
| TEST_F(JsonUtilTest, ParseMessage) {
|
| @@ -147,8 +172,9 @@ TEST_F(JsonUtilTest, ParseMessage) {
|
| " {\"value\": 40}, {\"value\": 96}\n"
|
| " ]\n"
|
| "}\n";
|
| + JsonParseOptions options;
|
| TestMessage m;
|
| - ASSERT_TRUE(FromJson(input, &m));
|
| + ASSERT_TRUE(FromJson(input, &m, options));
|
| EXPECT_EQ(1024, m.int32_value());
|
| ASSERT_EQ(2, m.repeated_int32_value_size());
|
| EXPECT_EQ(1, m.repeated_int32_value(0));
|
| @@ -162,27 +188,74 @@ TEST_F(JsonUtilTest, ParseMessage) {
|
| TEST_F(JsonUtilTest, ParseMap) {
|
| TestMap message;
|
| (*message.mutable_string_map())["hello"] = 1234;
|
| - JsonOptions options;
|
| - EXPECT_EQ("{\"stringMap\":{\"hello\":1234}}", ToJson(message, options));
|
| + JsonPrintOptions print_options;
|
| + JsonParseOptions parse_options;
|
| + EXPECT_EQ("{\"stringMap\":{\"hello\":1234}}", ToJson(message, print_options));
|
| TestMap other;
|
| - ASSERT_TRUE(FromJson(ToJson(message, options), &other));
|
| + ASSERT_TRUE(FromJson(ToJson(message, print_options), &other, parse_options));
|
| EXPECT_EQ(message.DebugString(), other.DebugString());
|
| }
|
|
|
| +TEST_F(JsonUtilTest, TestParseIgnoreUnknownFields) {
|
| + TestMessage m;
|
| + JsonParseOptions options;
|
| + options.ignore_unknown_fields = true;
|
| + EXPECT_TRUE(FromJson("{\"unknownName\":0}", &m, options));
|
| +}
|
| +
|
| TEST_F(JsonUtilTest, TestParseErrors) {
|
| TestMessage m;
|
| - JsonOptions options;
|
| + JsonParseOptions options;
|
| // Parsing should fail if the field name can not be recognized.
|
| - EXPECT_FALSE(FromJson("{\"unknownName\":0}", &m));
|
| + EXPECT_FALSE(FromJson("{\"unknownName\":0}", &m, options));
|
| // Parsing should fail if the value is invalid.
|
| - EXPECT_FALSE(FromJson("{\"int32Value\":2147483648}", &m));
|
| + EXPECT_FALSE(FromJson("{\"int32Value\":2147483648}", &m, options));
|
| +}
|
| +
|
| +TEST_F(JsonUtilTest, TestDynamicMessage) {
|
| + // Some random message but good enough to test the wrapper functions.
|
| + string input =
|
| + "{\n"
|
| + " \"int32Value\": 1024,\n"
|
| + " \"repeatedInt32Value\": [1, 2],\n"
|
| + " \"messageValue\": {\n"
|
| + " \"value\": 2048\n"
|
| + " },\n"
|
| + " \"repeatedMessageValue\": [\n"
|
| + " {\"value\": 40}, {\"value\": 96}\n"
|
| + " ]\n"
|
| + "}\n";
|
| +
|
| + // Create a new DescriptorPool with the same protos as the generated one.
|
| + DescriptorPoolDatabase database(*DescriptorPool::generated_pool());
|
| + DescriptorPool pool(&database);
|
| + // A dynamic version of the test proto.
|
| + DynamicMessageFactory factory;
|
| + google::protobuf::scoped_ptr<Message> message(factory.GetPrototype(
|
| + pool.FindMessageTypeByName("proto3.TestMessage"))->New());
|
| + EXPECT_TRUE(FromJson(input, message.get()));
|
| +
|
| + // Convert to generated message for easy inspection.
|
| + TestMessage generated;
|
| + EXPECT_TRUE(generated.ParseFromString(message->SerializeAsString()));
|
| + EXPECT_EQ(1024, generated.int32_value());
|
| + ASSERT_EQ(2, generated.repeated_int32_value_size());
|
| + EXPECT_EQ(1, generated.repeated_int32_value(0));
|
| + EXPECT_EQ(2, generated.repeated_int32_value(1));
|
| + EXPECT_EQ(2048, generated.message_value().value());
|
| + ASSERT_EQ(2, generated.repeated_message_value_size());
|
| + EXPECT_EQ(40, generated.repeated_message_value(0).value());
|
| + EXPECT_EQ(96, generated.repeated_message_value(1).value());
|
| +
|
| + JsonOptions options;
|
| + EXPECT_EQ(ToJson(generated, options), ToJson(*message, options));
|
| }
|
|
|
| -typedef pair<char*, int> Segment;
|
| +typedef std::pair<char*, int> Segment;
|
| // A ZeroCopyOutputStream that writes to multiple buffers.
|
| class SegmentedZeroCopyOutputStream : public io::ZeroCopyOutputStream {
|
| public:
|
| - explicit SegmentedZeroCopyOutputStream(list<Segment> segments)
|
| + explicit SegmentedZeroCopyOutputStream(std::list<Segment> segments)
|
| : segments_(segments), last_segment_(static_cast<char*>(NULL), 0), byte_count_(0) {}
|
|
|
| virtual bool Next(void** buffer, int* length) {
|
| @@ -208,7 +281,7 @@ class SegmentedZeroCopyOutputStream : public io::ZeroCopyOutputStream {
|
| virtual int64 ByteCount() const { return byte_count_; }
|
|
|
| private:
|
| - list<Segment> segments_;
|
| + std::list<Segment> segments_;
|
| Segment last_segment_;
|
| int64 byte_count_;
|
| };
|
| @@ -226,7 +299,7 @@ TEST(ZeroCopyStreamByteSinkTest, TestAllInputOutputPatterns) {
|
| for (int split_pattern = 0; split_pattern < (1 << (kOutputBufferLength - 1));
|
| split_pattern += kSkippedPatternCount) {
|
| // Split the buffer into small segments according to the split_pattern.
|
| - list<Segment> segments;
|
| + std::list<Segment> segments;
|
| int segment_start = 0;
|
| for (int i = 0; i < kOutputBufferLength - 1; ++i) {
|
| if (split_pattern & (1 << i)) {
|
|
|