|
@@ -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 {
|