|
|
|
@ -333,6 +333,64 @@ TEST_F(JsonUtilTest, TestDynamicMessage) { |
|
|
|
|
EXPECT_EQ(ToJson(generated, options), ToJson(*message, options)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST_F(JsonUtilTest, TestParsingUnknownEnumsAs0) { |
|
|
|
|
TestMessage m; |
|
|
|
|
{ |
|
|
|
|
JsonParseOptions options; |
|
|
|
|
ASSERT_FALSE(options.ignore_unknown_fields); |
|
|
|
|
string input = |
|
|
|
|
"{\n" |
|
|
|
|
" \"enum_value\":\"UNKNOWN_VALUE\"\n" |
|
|
|
|
"}"; |
|
|
|
|
m.set_enum_value(proto3::BAR); |
|
|
|
|
EXPECT_FALSE(FromJson(input, &m, options)); |
|
|
|
|
ASSERT_EQ(proto3::BAR, m.enum_value()); // Keep previous value
|
|
|
|
|
|
|
|
|
|
options.ignore_unknown_fields = true; |
|
|
|
|
EXPECT_TRUE(FromJson(input, &m, options)); |
|
|
|
|
EXPECT_EQ(0, m.enum_value()); // Unknown enum value must be decoded as 0
|
|
|
|
|
} |
|
|
|
|
// Integer values are read as usual
|
|
|
|
|
{ |
|
|
|
|
JsonParseOptions options; |
|
|
|
|
string input = |
|
|
|
|
"{\n" |
|
|
|
|
" \"enum_value\":12345\n" |
|
|
|
|
"}"; |
|
|
|
|
m.set_enum_value(proto3::BAR); |
|
|
|
|
EXPECT_TRUE(FromJson(input, &m, options)); |
|
|
|
|
ASSERT_EQ(12345, m.enum_value()); |
|
|
|
|
|
|
|
|
|
options.ignore_unknown_fields = true; |
|
|
|
|
EXPECT_TRUE(FromJson(input, &m, options)); |
|
|
|
|
EXPECT_EQ(12345, m.enum_value()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Trying to pass an object as an enum field value is always treated as an error
|
|
|
|
|
{ |
|
|
|
|
JsonParseOptions options; |
|
|
|
|
string input = |
|
|
|
|
"{\n" |
|
|
|
|
" \"enum_value\":{}\n" |
|
|
|
|
"}"; |
|
|
|
|
options.ignore_unknown_fields = true; |
|
|
|
|
EXPECT_FALSE(FromJson(input, &m, options)); |
|
|
|
|
options.ignore_unknown_fields = false; |
|
|
|
|
EXPECT_FALSE(FromJson(input, &m, options)); |
|
|
|
|
} |
|
|
|
|
// Trying to pass an array as an enum field value is always treated as an error
|
|
|
|
|
{ |
|
|
|
|
JsonParseOptions options; |
|
|
|
|
string input = |
|
|
|
|
"{\n" |
|
|
|
|
" \"enum_value\":[]\n" |
|
|
|
|
"}"; |
|
|
|
|
EXPECT_FALSE(FromJson(input, &m, options)); |
|
|
|
|
options.ignore_unknown_fields = true; |
|
|
|
|
EXPECT_FALSE(FromJson(input, &m, options)); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
typedef std::pair<char*, int> Segment; |
|
|
|
|
// A ZeroCopyOutputStream that writes to multiple buffers.
|
|
|
|
|
class SegmentedZeroCopyOutputStream : public io::ZeroCopyOutputStream { |
|
|
|
|