aboutsummaryrefslogtreecommitdiffhomepage
path: root/conformance
diff options
context:
space:
mode:
authorGravatar Paul Yang <TeBoring@users.noreply.github.com>2018-07-09 14:29:23 -0700
committerGravatar GitHub <noreply@github.com>2018-07-09 14:29:23 -0700
commit26eeec93e44024ee10c0b8c536ea2410e4bfa7f3 (patch)
treebd19449d12e795014250315982c9e9eefae1fb02 /conformance
parent96833b8f4b1897ae2a4ddf21ec9d1c5e6eabc8c7 (diff)
Enable ignoring unknown in json parsing in php (#4839)
* Enable ignoring unknown in json parsing in php * Update generated descriptor files * Update failure list for other languages. * Remove unnecessary php files
Diffstat (limited to 'conformance')
-rw-r--r--conformance/conformance.proto2
-rwxr-xr-xconformance/conformance_php.php8
-rw-r--r--conformance/conformance_test.cc246
-rw-r--r--conformance/conformance_test.h59
-rw-r--r--conformance/failure_list_cpp.txt6
-rw-r--r--conformance/failure_list_csharp.txt6
-rw-r--r--conformance/failure_list_java.txt6
-rw-r--r--conformance/failure_list_php_c.txt56
-rw-r--r--conformance/failure_list_python-post26.txt6
-rw-r--r--conformance/failure_list_python.txt6
-rw-r--r--conformance/failure_list_python_cpp.txt6
-rw-r--r--conformance/failure_list_ruby.txt6
12 files changed, 253 insertions, 160 deletions
diff --git a/conformance/conformance.proto b/conformance/conformance.proto
index 525140e9..897e7b38 100644
--- a/conformance/conformance.proto
+++ b/conformance/conformance.proto
@@ -82,6 +82,8 @@ message ConformanceRequest {
// protobuf_test_messages.proto3.TestAllTypesProto3 or
// protobuf_test_messages.proto2.TestAllTypesProto2.
string message_type = 4;
+
+ bool ignore_unknown_json = 5;
}
// Represents a single test case's output.
diff --git a/conformance/conformance_php.php b/conformance/conformance_php.php
index 19f9a092..65483e27 100755
--- a/conformance/conformance_php.php
+++ b/conformance/conformance_php.php
@@ -6,8 +6,8 @@ require_once("Conformance/ConformanceRequest.php");
require_once("Protobuf_test_messages/Proto3/ForeignMessage.php");
require_once("Protobuf_test_messages/Proto3/ForeignEnum.php");
require_once("Protobuf_test_messages/Proto3/TestAllTypesProto3.php");
-require_once("Protobuf_test_messages/Proto3/TestAllTypesProto3_NestedMessage.php");
-require_once("Protobuf_test_messages/Proto3/TestAllTypesProto3_NestedEnum.php");
+require_once("Protobuf_test_messages/Proto3/TestAllTypesProto3/NestedMessage.php");
+require_once("Protobuf_test_messages/Proto3/TestAllTypesProto3/NestedEnum.php");
require_once("GPBMetadata/Conformance.php");
require_once("GPBMetadata/Google/Protobuf/TestMessagesProto3.php");
@@ -39,8 +39,10 @@ function doTest($request)
trigger_error("Protobuf request doesn't have specific payload type", E_USER_ERROR);
}
} elseif ($request->getPayload() == "json_payload") {
+ $ignore_json_unknown = $request->getIgnoreUnknownJson();
try {
- $test_message->mergeFromJsonString($request->getJsonPayload());
+ $test_message->mergeFromJsonString($request->getJsonPayload(),
+ $ignore_json_unknown);
} catch (Exception $e) {
$response->setParseError($e->getMessage());
return $response;
diff --git a/conformance/conformance_test.cc b/conformance/conformance_test.cc
index 22bbbfb3..d9e88ce5 100644
--- a/conformance/conformance_test.cc
+++ b/conformance/conformance_test.cc
@@ -191,6 +191,78 @@ string UpperCase(string str) {
namespace google {
namespace protobuf {
+ConformanceTestSuite::ConformanceRequestSetting::ConformanceRequestSetting(
+ ConformanceLevel level, conformance::WireFormat input_format,
+ conformance::WireFormat output_format, bool is_proto3,
+ const string& test_name, const string& input)
+ : level_(level), input_format_(input_format),
+ output_format_(output_format), is_proto3_(is_proto3) {
+ auto newTestMessage = [&is_proto3]() {
+ Message* newMessage;
+ if (is_proto3) {
+ newMessage = new TestAllTypesProto3;
+ } else {
+ newMessage = new TestAllTypesProto2;
+ }
+ return newMessage;
+ };
+
+ string input_format_string;
+ string output_format_string;
+ string rname = is_proto3 ? ".Proto3" : ".Proto2";
+
+ switch (input_format) {
+ case conformance::PROTOBUF: {
+ request_.set_protobuf_payload(input);
+ input_format_string = ".ProtobufInput.";
+ break;
+ }
+
+ case conformance::JSON: {
+ request_.set_json_payload(input);
+ input_format_string = ".JsonInput.";
+ break;
+ }
+
+ default:
+ GOOGLE_LOG(FATAL) << "Unspecified input format";
+ }
+
+ switch (output_format) {
+ case conformance::PROTOBUF: {
+ output_format_string = ".ProtobufOutput";
+ break;
+ }
+
+ case conformance::JSON: {
+ output_format_string = ".JsonOutput";
+ break;
+ }
+
+ default:
+ GOOGLE_LOG(FATAL) << "Unspecified output format";
+ }
+
+ test_name_ = ConformanceLevelToString(level) + rname +
+ input_format_string + test_name +
+ output_format_string;
+
+ if (is_proto3) {
+ request_.set_message_type("protobuf_test_messages.proto3.TestAllTypesProto3");
+ } else {
+ request_.set_message_type("protobuf_test_messages.proto2.TestAllTypesProto2");
+ }
+ request_.set_requested_output_format(output_format);
+}
+
+Message* ConformanceTestSuite::ConformanceRequestSetting::GetTestMessage() const {
+ if (is_proto3_) {
+ return new TestAllTypesProto3();
+ } else {
+ return new TestAllTypesProto2();
+ }
+}
+
void ConformanceTestSuite::ReportSuccess(const string& test_name) {
if (expected_to_fail_.erase(test_name) != 0) {
StringAppendF(&output_,
@@ -273,75 +345,36 @@ void ConformanceTestSuite::RunTest(const string& test_name,
}
void ConformanceTestSuite::RunValidInputTest(
- const string& test_name, ConformanceLevel level, const string& input,
- WireFormat input_format, const string& equivalent_text_format,
- WireFormat requested_output, bool isProto3) {
- auto newTestMessage = [&isProto3]() {
- Message* newMessage;
- if (isProto3) {
- newMessage = new TestAllTypesProto3;
- } else {
- newMessage = new TestAllTypesProto2;
- }
- return newMessage;
- };
- Message* reference_message = newTestMessage();
+ const ConformanceRequestSetting& setting,
+ const string& equivalent_text_format) {
+ Message* reference_message = setting.GetTestMessage();
GOOGLE_CHECK(
TextFormat::ParseFromString(equivalent_text_format, reference_message))
- << "Failed to parse data for test case: " << test_name
+ << "Failed to parse data for test case: " << setting.GetTestName()
<< ", data: " << equivalent_text_format;
const string equivalent_wire_format = reference_message->SerializeAsString();
- RunValidBinaryInputTest(test_name, level, input, input_format,
- equivalent_wire_format, requested_output, isProto3);
+ RunValidBinaryInputTest(setting, equivalent_wire_format);
}
void ConformanceTestSuite::RunValidBinaryInputTest(
- const string& test_name, ConformanceLevel level, const string& input,
- WireFormat input_format, const string& equivalent_wire_format,
- WireFormat requested_output, bool isProto3) {
- auto newTestMessage = [&isProto3]() {
- Message* newMessage;
- if (isProto3) {
- newMessage = new TestAllTypesProto3;
- } else {
- newMessage = new TestAllTypesProto2;
- }
- return newMessage;
- };
- Message* reference_message = newTestMessage();
+ const ConformanceRequestSetting& setting,
+ const string& equivalent_wire_format) {
+ const string& test_name = setting.GetTestName();
+ ConformanceLevel level = setting.GetLevel();
+
+ Message* reference_message = setting.GetTestMessage();
GOOGLE_CHECK(
reference_message->ParseFromString(equivalent_wire_format))
<< "Failed to parse wire data for test case: " << test_name;
- ConformanceRequest request;
+ const ConformanceRequest& request = setting.GetRequest();
ConformanceResponse response;
- switch (input_format) {
- case conformance::PROTOBUF: {
- request.set_protobuf_payload(input);
- if (isProto3) {
- request.set_message_type("protobuf_test_messages.proto3.TestAllTypesProto3");
- } else {
- request.set_message_type("protobuf_test_messages.proto2.TestAllTypesProto2");
- }
- break;
- }
-
- case conformance::JSON: {
- request.set_message_type("protobuf_test_messages.proto3.TestAllTypesProto3");
- request.set_json_payload(input);
- break;
- }
-
- default:
- GOOGLE_LOG(FATAL) << "Unspecified input format";
- }
-
- request.set_requested_output_format(requested_output);
-
RunTest(test_name, request, &response);
- Message *test_message = newTestMessage();
+ Message* test_message = setting.GetTestMessage();
+
+ WireFormat requested_output = request.requested_output_format();
switch (response.result_case()) {
case ConformanceResponse::RESULT_NOT_SET:
@@ -476,56 +509,60 @@ void ConformanceTestSuite::ExpectHardParseFailureForProto(
void ConformanceTestSuite::RunValidJsonTest(
const string& test_name, ConformanceLevel level, const string& input_json,
const string& equivalent_text_format) {
- RunValidInputTest(
- ConformanceLevelToString(level) + ".Proto3.JsonInput." + test_name +
- ".ProtobufOutput", level, input_json, conformance::JSON,
- equivalent_text_format, conformance::PROTOBUF, true);
- RunValidInputTest(
- ConformanceLevelToString(level) + ".Proto3.JsonInput." + test_name +
- ".JsonOutput", level, input_json, conformance::JSON,
- equivalent_text_format, conformance::JSON, true);
+ ConformanceRequestSetting setting1(
+ level, conformance::JSON, conformance::PROTOBUF,
+ true, test_name, input_json);
+ RunValidInputTest(setting1, equivalent_text_format);
+
+ ConformanceRequestSetting setting2(
+ level, conformance::JSON, conformance::JSON,
+ true, test_name, input_json);
+ RunValidInputTest(setting2, equivalent_text_format);
}
void ConformanceTestSuite::RunValidJsonTestWithProtobufInput(
const string& test_name, ConformanceLevel level, const TestAllTypesProto3& input,
const string& equivalent_text_format) {
- RunValidInputTest(
- ConformanceLevelToString(level) + ".Proto3" + ".ProtobufInput." + test_name +
- ".JsonOutput", level, input.SerializeAsString(), conformance::PROTOBUF,
- equivalent_text_format, conformance::JSON, true);
+ ConformanceRequestSetting setting(
+ level, conformance::PROTOBUF, conformance::JSON,
+ true, test_name, input.SerializeAsString());
+ RunValidInputTest(setting, equivalent_text_format);
+}
+
+void ConformanceTestSuite::RunValidJsonIgnoreUnknownTest(
+ const string& test_name, ConformanceLevel level, const string& input_json,
+ const string& equivalent_text_format) {
+ ConformanceRequestSetting setting(
+ level, conformance::JSON, conformance::PROTOBUF,
+ true, test_name, input_json);
+ setting.SetIgnoreUnknownJson(true);
+ RunValidInputTest(setting, equivalent_text_format);
}
void ConformanceTestSuite::RunValidProtobufTest(
const string& test_name, ConformanceLevel level,
const string& input_protobuf, const string& equivalent_text_format,
bool isProto3) {
- string rname = ".Proto3";
- if (!isProto3) {
- rname = ".Proto2";
- }
- RunValidInputTest(
- ConformanceLevelToString(level) + rname + ".ProtobufInput." + test_name +
- ".ProtobufOutput", level, input_protobuf, conformance::PROTOBUF,
- equivalent_text_format, conformance::PROTOBUF, isProto3);
+ ConformanceRequestSetting setting1(
+ level, conformance::PROTOBUF, conformance::PROTOBUF,
+ isProto3, test_name, input_protobuf);
+ RunValidInputTest(setting1, equivalent_text_format);
+
if (isProto3) {
- RunValidInputTest(
- ConformanceLevelToString(level) + rname + ".ProtobufInput." + test_name +
- ".JsonOutput", level, input_protobuf, conformance::PROTOBUF,
- equivalent_text_format, conformance::JSON, isProto3);
+ ConformanceRequestSetting setting2(
+ level, conformance::PROTOBUF, conformance::JSON,
+ true, test_name, input_protobuf);
+ RunValidInputTest(setting2, equivalent_text_format);
}
}
void ConformanceTestSuite::RunValidBinaryProtobufTest(
const string& test_name, ConformanceLevel level,
const string& input_protobuf, bool isProto3) {
- string rname = ".Proto3";
- if (!isProto3) {
- rname = ".Proto2";
- }
- RunValidBinaryInputTest(
- ConformanceLevelToString(level) + rname + ".ProtobufInput." + test_name +
- ".ProtobufOutput", level, input_protobuf, conformance::PROTOBUF,
- input_protobuf, conformance::PROTOBUF, isProto3);
+ ConformanceRequestSetting setting(
+ level, conformance::PROTOBUF, conformance::PROTOBUF,
+ isProto3, test_name, input_protobuf);
+ RunValidBinaryInputTest(setting, input_protobuf);
}
void ConformanceTestSuite::RunValidProtobufTestWithMessage(
@@ -2535,6 +2572,43 @@ bool ConformanceTestSuite::RunSuite(ConformanceTestRunner* runner,
}
)");
+ RunValidJsonIgnoreUnknownTest(
+ "IgnoreUnknownJsonNumber", REQUIRED,
+ R"({
+ "unknown": 1
+ })",
+ "");
+ RunValidJsonIgnoreUnknownTest(
+ "IgnoreUnknownJsonString", REQUIRED,
+ R"({
+ "unknown": "a"
+ })",
+ "");
+ RunValidJsonIgnoreUnknownTest(
+ "IgnoreUnknownJsonTrue", REQUIRED,
+ R"({
+ "unknown": true
+ })",
+ "");
+ RunValidJsonIgnoreUnknownTest(
+ "IgnoreUnknownJsonFalse", REQUIRED,
+ R"({
+ "unknown": false
+ })",
+ "");
+ RunValidJsonIgnoreUnknownTest(
+ "IgnoreUnknownJsonNull", REQUIRED,
+ R"({
+ "unknown": null
+ })",
+ "");
+ RunValidJsonIgnoreUnknownTest(
+ "IgnoreUnknownJsonObject", REQUIRED,
+ R"({
+ "unknown": {"a": 1}
+ })",
+ "");
+
bool ok = true;
if (!CheckSetEmpty(expected_to_fail_, "nonexistent_tests.txt",
"These tests were listed in the failure list, but they "
diff --git a/conformance/conformance_test.h b/conformance/conformance_test.h
index 2649f8b2..685f67fb 100644
--- a/conformance/conformance_test.h
+++ b/conformance/conformance_test.h
@@ -44,6 +44,7 @@
#include <google/protobuf/util/type_resolver.h>
#include <google/protobuf/wire_format_lite.h>
+#include "conformance.pb.h"
#include "third_party/jsoncpp/json.h"
namespace conformance {
@@ -146,7 +147,42 @@ class ConformanceTestSuite {
REQUIRED = 0,
RECOMMENDED = 1,
};
- string ConformanceLevelToString(ConformanceLevel level);
+
+ class ConformanceRequestSetting {
+ public:
+ ConformanceRequestSetting(
+ ConformanceLevel level, conformance::WireFormat input_format,
+ conformance::WireFormat output_format, bool is_proto3,
+ const string& test_name, const string& input);
+
+ Message* GetTestMessage() const;
+
+ const string& GetTestName() const {
+ return test_name_;
+ }
+
+ const conformance::ConformanceRequest& GetRequest() const {
+ return request_;
+ }
+
+ const ConformanceLevel GetLevel() const {
+ return level_;
+ }
+
+ void SetIgnoreUnknownJson(bool ignore_unknown_json) {
+ request_.set_ignore_unknown_json(ignore_unknown_json);
+ }
+
+ private:
+ ConformanceLevel level_;
+ conformance::WireFormat input_format_;
+ conformance::WireFormat output_format_;
+ bool is_proto3_;
+ string test_name_;
+ conformance::ConformanceRequest request_;
+ };
+
+ static string ConformanceLevelToString(ConformanceLevel level);
void ReportSuccess(const std::string& test_name);
void ReportFailure(const string& test_name,
@@ -160,24 +196,17 @@ class ConformanceTestSuite {
void RunTest(const std::string& test_name,
const conformance::ConformanceRequest& request,
conformance::ConformanceResponse* response);
- void RunValidInputTest(const string& test_name,
- ConformanceLevel level,
- const string& input,
- conformance::WireFormat input_format,
- const string& equivalent_text_format,
- conformance::WireFormat requested_output,
- bool isProto3);
- void RunValidBinaryInputTest(const string& test_name,
- ConformanceLevel level,
- const string& input,
- conformance::WireFormat input_format,
- const string& equivalent_wire_format,
- conformance::WireFormat requested_output,
- bool isProto3);
+ void RunValidInputTest(const ConformanceRequestSetting& setting,
+ const string& equivalent_text_format);
+ void RunValidBinaryInputTest(const ConformanceRequestSetting& setting,
+ const string& equivalent_wire_format);
void RunValidJsonTest(const string& test_name,
ConformanceLevel level,
const string& input_json,
const string& equivalent_text_format);
+ void RunValidJsonIgnoreUnknownTest(
+ const string& test_name, ConformanceLevel level, const string& input_json,
+ const string& equivalent_text_format);
void RunValidJsonTestWithProtobufInput(
const string& test_name,
ConformanceLevel level,
diff --git a/conformance/failure_list_cpp.txt b/conformance/failure_list_cpp.txt
index 752fbb5d..ea8e8473 100644
--- a/conformance/failure_list_cpp.txt
+++ b/conformance/failure_list_cpp.txt
@@ -54,3 +54,9 @@ Required.Proto2.ProtobufInput.PrematureEofInPackedField.SINT32
Required.Proto2.ProtobufInput.PrematureEofInPackedField.SINT64
Required.Proto2.ProtobufInput.PrematureEofInPackedField.UINT32
Required.Proto2.ProtobufInput.PrematureEofInPackedField.UINT64
+Required.Proto3.JsonInput.IgnoreUnknownJsonFalse.ProtobufOutput
+Required.Proto3.JsonInput.IgnoreUnknownJsonNull.ProtobufOutput
+Required.Proto3.JsonInput.IgnoreUnknownJsonNumber.ProtobufOutput
+Required.Proto3.JsonInput.IgnoreUnknownJsonObject.ProtobufOutput
+Required.Proto3.JsonInput.IgnoreUnknownJsonString.ProtobufOutput
+Required.Proto3.JsonInput.IgnoreUnknownJsonTrue.ProtobufOutput
diff --git a/conformance/failure_list_csharp.txt b/conformance/failure_list_csharp.txt
index 2a20aa78..69c723b5 100644
--- a/conformance/failure_list_csharp.txt
+++ b/conformance/failure_list_csharp.txt
@@ -1,2 +1,8 @@
Recommended.Proto3.JsonInput.BytesFieldBase64Url.JsonOutput
Recommended.Proto3.JsonInput.BytesFieldBase64Url.ProtobufOutput
+Required.Proto3.JsonInput.IgnoreUnknownJsonFalse.ProtobufOutput
+Required.Proto3.JsonInput.IgnoreUnknownJsonNull.ProtobufOutput
+Required.Proto3.JsonInput.IgnoreUnknownJsonNumber.ProtobufOutput
+Required.Proto3.JsonInput.IgnoreUnknownJsonObject.ProtobufOutput
+Required.Proto3.JsonInput.IgnoreUnknownJsonString.ProtobufOutput
+Required.Proto3.JsonInput.IgnoreUnknownJsonTrue.ProtobufOutput
diff --git a/conformance/failure_list_java.txt b/conformance/failure_list_java.txt
index dc1f9ba5..6f085c66 100644
--- a/conformance/failure_list_java.txt
+++ b/conformance/failure_list_java.txt
@@ -45,3 +45,9 @@ Required.Proto3.ProtobufInput.PrematureEofInDelimitedDataForKnownNonRepeatedValu
Required.Proto3.ProtobufInput.PrematureEofInDelimitedDataForKnownRepeatedValue.MESSAGE
Required.Proto2.ProtobufInput.PrematureEofInDelimitedDataForKnownNonRepeatedValue.MESSAGE
Required.Proto2.ProtobufInput.PrematureEofInDelimitedDataForKnownRepeatedValue.MESSAGE
+Required.Proto3.JsonInput.IgnoreUnknownJsonFalse.ProtobufOutput
+Required.Proto3.JsonInput.IgnoreUnknownJsonNull.ProtobufOutput
+Required.Proto3.JsonInput.IgnoreUnknownJsonNumber.ProtobufOutput
+Required.Proto3.JsonInput.IgnoreUnknownJsonObject.ProtobufOutput
+Required.Proto3.JsonInput.IgnoreUnknownJsonString.ProtobufOutput
+Required.Proto3.JsonInput.IgnoreUnknownJsonTrue.ProtobufOutput
diff --git a/conformance/failure_list_php_c.txt b/conformance/failure_list_php_c.txt
index 088708e9..6ecd94fd 100644
--- a/conformance/failure_list_php_c.txt
+++ b/conformance/failure_list_php_c.txt
@@ -1,8 +1,6 @@
Recommended.FieldMaskNumbersDontRoundTrip.JsonOutput
Recommended.FieldMaskPathsDontRoundTrip.JsonOutput
Recommended.FieldMaskTooManyUnderscore.JsonOutput
-Recommended.Proto3.JsonInput.BoolFieldIntegerOne
-Recommended.Proto3.JsonInput.BoolFieldIntegerZero
Recommended.Proto3.JsonInput.DurationHas3FractionalDigits.Validator
Recommended.Proto3.JsonInput.DurationHas6FractionalDigits.Validator
Recommended.Proto3.JsonInput.DurationHas9FractionalDigits.Validator
@@ -10,9 +8,6 @@ Recommended.Proto3.JsonInput.DurationHasZeroFractionalDigit.Validator
Recommended.Proto3.JsonInput.Int64FieldBeString.Validator
Recommended.Proto3.JsonInput.MapFieldValueIsNull
Recommended.Proto3.JsonInput.OneofZeroBytes.JsonOutput
-Recommended.Proto3.JsonInput.OneofZeroBytes.ProtobufOutput
-Recommended.Proto3.JsonInput.OneofZeroString.JsonOutput
-Recommended.Proto3.JsonInput.OneofZeroString.ProtobufOutput
Recommended.Proto3.JsonInput.RepeatedFieldMessageElementIsNull
Recommended.Proto3.JsonInput.RepeatedFieldPrimitiveElementIsNull
Recommended.Proto3.JsonInput.StringEndsWithEscapeChar
@@ -21,9 +16,6 @@ Recommended.Proto3.JsonInput.StringFieldUnpairedHighSurrogate
Recommended.Proto3.JsonInput.StringFieldUnpairedLowSurrogate
Recommended.Proto3.JsonInput.Uint64FieldBeString.Validator
Recommended.Proto3.ProtobufInput.OneofZeroBytes.JsonOutput
-Recommended.Proto3.ProtobufInput.OneofZeroBytes.ProtobufOutput
-Recommended.Proto3.ProtobufInput.OneofZeroString.JsonOutput
-Recommended.Proto3.ProtobufInput.OneofZeroString.ProtobufOutput
Required.DurationProtoInputTooLarge.JsonOutput
Required.DurationProtoInputTooSmall.JsonOutput
Required.Proto3.JsonInput.Any.JsonOutput
@@ -47,63 +39,22 @@ Required.Proto3.JsonInput.AnyWithValueForInteger.ProtobufOutput
Required.Proto3.JsonInput.AnyWithValueForJsonObject.JsonOutput
Required.Proto3.JsonInput.AnyWithValueForJsonObject.ProtobufOutput
Required.Proto3.JsonInput.BoolMapField.JsonOutput
-Required.Proto3.JsonInput.DoubleFieldInfinity.JsonOutput
-Required.Proto3.JsonInput.DoubleFieldInfinity.ProtobufOutput
Required.Proto3.JsonInput.DoubleFieldMaxNegativeValue.JsonOutput
Required.Proto3.JsonInput.DoubleFieldMaxNegativeValue.ProtobufOutput
-Required.Proto3.JsonInput.DoubleFieldMaxPositiveValue.JsonOutput
-Required.Proto3.JsonInput.DoubleFieldMaxPositiveValue.ProtobufOutput
-Required.Proto3.JsonInput.DoubleFieldMinNegativeValue.JsonOutput
-Required.Proto3.JsonInput.DoubleFieldMinNegativeValue.ProtobufOutput
Required.Proto3.JsonInput.DoubleFieldMinPositiveValue.JsonOutput
Required.Proto3.JsonInput.DoubleFieldMinPositiveValue.ProtobufOutput
Required.Proto3.JsonInput.DoubleFieldNan.JsonOutput
-Required.Proto3.JsonInput.DoubleFieldNan.ProtobufOutput
-Required.Proto3.JsonInput.DoubleFieldNegativeInfinity.JsonOutput
-Required.Proto3.JsonInput.DoubleFieldNegativeInfinity.ProtobufOutput
-Required.Proto3.JsonInput.DoubleFieldQuotedValue.JsonOutput
-Required.Proto3.JsonInput.DoubleFieldQuotedValue.ProtobufOutput
Required.Proto3.JsonInput.DurationMaxValue.JsonOutput
Required.Proto3.JsonInput.DurationMaxValue.ProtobufOutput
Required.Proto3.JsonInput.DurationMinValue.JsonOutput
Required.Proto3.JsonInput.DurationMinValue.ProtobufOutput
Required.Proto3.JsonInput.DurationRepeatedValue.JsonOutput
Required.Proto3.JsonInput.DurationRepeatedValue.ProtobufOutput
-Required.Proto3.JsonInput.EnumFieldNumericValueNonZero.JsonOutput
-Required.Proto3.JsonInput.EnumFieldNumericValueNonZero.ProtobufOutput
-Required.Proto3.JsonInput.EnumFieldNumericValueZero.JsonOutput
-Required.Proto3.JsonInput.EnumFieldNumericValueZero.ProtobufOutput
-Required.Proto3.JsonInput.EnumFieldUnknownValue.Validator
Required.Proto3.JsonInput.FieldMask.JsonOutput
Required.Proto3.JsonInput.FieldMask.ProtobufOutput
Required.Proto3.JsonInput.FloatFieldInfinity.JsonOutput
-Required.Proto3.JsonInput.FloatFieldInfinity.ProtobufOutput
Required.Proto3.JsonInput.FloatFieldNan.JsonOutput
-Required.Proto3.JsonInput.FloatFieldNan.ProtobufOutput
Required.Proto3.JsonInput.FloatFieldNegativeInfinity.JsonOutput
-Required.Proto3.JsonInput.FloatFieldNegativeInfinity.ProtobufOutput
-Required.Proto3.JsonInput.FloatFieldQuotedValue.JsonOutput
-Required.Proto3.JsonInput.FloatFieldQuotedValue.ProtobufOutput
-Required.Proto3.JsonInput.FloatFieldTooLarge
-Required.Proto3.JsonInput.FloatFieldTooSmall
-Required.Proto3.JsonInput.Int32FieldExponentialFormat.JsonOutput
-Required.Proto3.JsonInput.Int32FieldExponentialFormat.ProtobufOutput
-Required.Proto3.JsonInput.Int32FieldFloatTrailingZero.JsonOutput
-Required.Proto3.JsonInput.Int32FieldFloatTrailingZero.ProtobufOutput
-Required.Proto3.JsonInput.Int32FieldMaxFloatValue.JsonOutput
-Required.Proto3.JsonInput.Int32FieldMaxFloatValue.ProtobufOutput
-Required.Proto3.JsonInput.Int32FieldMinFloatValue.JsonOutput
-Required.Proto3.JsonInput.Int32FieldMinFloatValue.ProtobufOutput
-Required.Proto3.JsonInput.Int32FieldStringValue.JsonOutput
-Required.Proto3.JsonInput.Int32FieldStringValue.ProtobufOutput
-Required.Proto3.JsonInput.Int32FieldStringValueEscaped.JsonOutput
-Required.Proto3.JsonInput.Int32FieldStringValueEscaped.ProtobufOutput
-Required.Proto3.JsonInput.Int64FieldMaxValue.JsonOutput
-Required.Proto3.JsonInput.Int64FieldMaxValue.ProtobufOutput
-Required.Proto3.JsonInput.Int64FieldMinValue.JsonOutput
-Required.Proto3.JsonInput.Int64FieldMinValue.ProtobufOutput
-Required.Proto3.JsonInput.MessageField.JsonOutput
-Required.Proto3.JsonInput.MessageField.ProtobufOutput
Required.Proto3.JsonInput.OptionalBoolWrapper.JsonOutput
Required.Proto3.JsonInput.OptionalBoolWrapper.ProtobufOutput
Required.Proto3.JsonInput.OptionalBytesWrapper.JsonOutput
@@ -130,8 +81,6 @@ Required.Proto3.JsonInput.RepeatedBytesWrapper.JsonOutput
Required.Proto3.JsonInput.RepeatedBytesWrapper.ProtobufOutput
Required.Proto3.JsonInput.RepeatedDoubleWrapper.JsonOutput
Required.Proto3.JsonInput.RepeatedDoubleWrapper.ProtobufOutput
-Required.Proto3.JsonInput.RepeatedFieldWrongElementTypeExpectingMessagesGotInt
-Required.Proto3.JsonInput.RepeatedFieldWrongElementTypeExpectingStringsGotInt
Required.Proto3.JsonInput.RepeatedFloatWrapper.JsonOutput
Required.Proto3.JsonInput.RepeatedFloatWrapper.ProtobufOutput
Required.Proto3.JsonInput.RepeatedInt32Wrapper.JsonOutput
@@ -146,7 +95,6 @@ Required.Proto3.JsonInput.RepeatedUint64Wrapper.JsonOutput
Required.Proto3.JsonInput.RepeatedUint64Wrapper.ProtobufOutput
Required.Proto3.JsonInput.StringFieldEscape.JsonOutput
Required.Proto3.JsonInput.StringFieldEscape.ProtobufOutput
-Required.Proto3.JsonInput.StringFieldNotAString
Required.Proto3.JsonInput.StringFieldSurrogatePair.JsonOutput
Required.Proto3.JsonInput.StringFieldSurrogatePair.ProtobufOutput
Required.Proto3.JsonInput.StringFieldUnicodeEscape.JsonOutput
@@ -155,10 +103,6 @@ Required.Proto3.JsonInput.StringFieldUnicodeEscapeWithLowercaseHexLetters.JsonOu
Required.Proto3.JsonInput.StringFieldUnicodeEscapeWithLowercaseHexLetters.ProtobufOutput
Required.Proto3.JsonInput.Struct.JsonOutput
Required.Proto3.JsonInput.Struct.ProtobufOutput
-Required.Proto3.JsonInput.Uint32FieldMaxFloatValue.JsonOutput
-Required.Proto3.JsonInput.Uint32FieldMaxFloatValue.ProtobufOutput
-Required.Proto3.JsonInput.Uint64FieldMaxValue.JsonOutput
-Required.Proto3.JsonInput.Uint64FieldMaxValue.ProtobufOutput
Required.Proto3.JsonInput.ValueAcceptBool.JsonOutput
Required.Proto3.JsonInput.ValueAcceptBool.ProtobufOutput
Required.Proto3.JsonInput.ValueAcceptFloat.JsonOutput
diff --git a/conformance/failure_list_python-post26.txt b/conformance/failure_list_python-post26.txt
index 19d99b04..60b1146e 100644
--- a/conformance/failure_list_python-post26.txt
+++ b/conformance/failure_list_python-post26.txt
@@ -1,2 +1,8 @@
JsonInput.StringFieldSurrogateInWrongOrder
JsonInput.StringFieldUnpairedHighSurrogate
+Required.Proto3.JsonInput.IgnoreUnknownJsonFalse.ProtobufOutput
+Required.Proto3.JsonInput.IgnoreUnknownJsonNull.ProtobufOutput
+Required.Proto3.JsonInput.IgnoreUnknownJsonNumber.ProtobufOutput
+Required.Proto3.JsonInput.IgnoreUnknownJsonObject.ProtobufOutput
+Required.Proto3.JsonInput.IgnoreUnknownJsonString.ProtobufOutput
+Required.Proto3.JsonInput.IgnoreUnknownJsonTrue.ProtobufOutput
diff --git a/conformance/failure_list_python.txt b/conformance/failure_list_python.txt
index e3ce7af7..5f01b53b 100644
--- a/conformance/failure_list_python.txt
+++ b/conformance/failure_list_python.txt
@@ -19,3 +19,9 @@ Required.Proto3.ProtobufInput.IllegalZeroFieldNum_Case_0
Required.Proto3.ProtobufInput.IllegalZeroFieldNum_Case_1
Required.Proto3.ProtobufInput.IllegalZeroFieldNum_Case_2
Required.Proto3.ProtobufInput.IllegalZeroFieldNum_Case_3
+Required.Proto3.JsonInput.IgnoreUnknownJsonFalse.ProtobufOutput
+Required.Proto3.JsonInput.IgnoreUnknownJsonNull.ProtobufOutput
+Required.Proto3.JsonInput.IgnoreUnknownJsonNumber.ProtobufOutput
+Required.Proto3.JsonInput.IgnoreUnknownJsonObject.ProtobufOutput
+Required.Proto3.JsonInput.IgnoreUnknownJsonString.ProtobufOutput
+Required.Proto3.JsonInput.IgnoreUnknownJsonTrue.ProtobufOutput
diff --git a/conformance/failure_list_python_cpp.txt b/conformance/failure_list_python_cpp.txt
index a498ad1a..f80517d9 100644
--- a/conformance/failure_list_python_cpp.txt
+++ b/conformance/failure_list_python_cpp.txt
@@ -52,3 +52,9 @@ Required.Proto2.ProtobufInput.PrematureEofInPackedField.SINT32
Required.Proto2.ProtobufInput.PrematureEofInPackedField.SINT64
Required.Proto2.ProtobufInput.PrematureEofInPackedField.UINT32
Required.Proto2.ProtobufInput.PrematureEofInPackedField.UINT64
+Required.Proto3.JsonInput.IgnoreUnknownJsonFalse.ProtobufOutput
+Required.Proto3.JsonInput.IgnoreUnknownJsonNull.ProtobufOutput
+Required.Proto3.JsonInput.IgnoreUnknownJsonNumber.ProtobufOutput
+Required.Proto3.JsonInput.IgnoreUnknownJsonObject.ProtobufOutput
+Required.Proto3.JsonInput.IgnoreUnknownJsonString.ProtobufOutput
+Required.Proto3.JsonInput.IgnoreUnknownJsonTrue.ProtobufOutput
diff --git a/conformance/failure_list_ruby.txt b/conformance/failure_list_ruby.txt
index b2683372..2d09acd4 100644
--- a/conformance/failure_list_ruby.txt
+++ b/conformance/failure_list_ruby.txt
@@ -135,3 +135,9 @@ Required.Proto3.ProtobufInput.FloatFieldNormalizeSignalingNan.JsonOutput
Required.Proto3.ProtobufInput.ValidDataRepeated.FLOAT.JsonOutput
Required.TimestampProtoInputTooLarge.JsonOutput
Required.TimestampProtoInputTooSmall.JsonOutput
+Required.Proto3.JsonInput.IgnoreUnknownJsonFalse.ProtobufOutput
+Required.Proto3.JsonInput.IgnoreUnknownJsonNull.ProtobufOutput
+Required.Proto3.JsonInput.IgnoreUnknownJsonNumber.ProtobufOutput
+Required.Proto3.JsonInput.IgnoreUnknownJsonObject.ProtobufOutput
+Required.Proto3.JsonInput.IgnoreUnknownJsonString.ProtobufOutput
+Required.Proto3.JsonInput.IgnoreUnknownJsonTrue.ProtobufOutput