jakartaee / jsonb-api

Jakarta JSON Binding
https://eclipse-ee4j.github.io/jsonb-api/
Other
79 stars 39 forks source link

[TCK] Tests incorrectly assumes that Charset.defaultCharset() is always UTF-8 #348

Open KyleAure opened 10 months ago

KyleAure commented 10 months ago

When running the TCK on an OS/JDK combination that uses a different character encoding other than UTF-8 the following tests fail:

<testcase classname="ee.jakarta.tck.json.bind.api.jsonb.JsonbTest" name="testFromJsonReaderClass" time="0.001">
<testcase classname="ee.jakarta.tck.json.bind.api.jsonb.JsonbTest" name="testToJsonObjectTypeWriter" time="0.001">
<testcase classname="ee.jakarta.tck.json.bind.api.jsonb.JsonbTest" name="testFromJsonReaderType" time="0">
<testcase classname="ee.jakarta.tck.json.bind.api.jsonb.JsonbTest" name="testToJsonObjectWriter" time="0.001">
<testcase classname="ee.jakarta.tck.json.bind.customizedmapping.binarydata.BinaryDataCustomizationTest" name="testBase64UrlBinaryDataEncoding" time="0.016">
<testcase classname="ee.jakarta.tck.json.bind.customizedmapping.binarydata.BinaryDataCustomizationTest" name="testByteBinaryDataEncoding" time="0.002">
<testcase classname="ee.jakarta.tck.json.bind.customizedmapping.binarydata.BinaryDataCustomizationTest" name="testBase64BinaryDataEncoding" time="0.001">
<testcase classname="ee.jakarta.tck.json.bind.customizedmapping.ijson.IJsonSupportTest" name="testStrictNonObjectOrArrayTopLevel" time="0.002">
<testcase classname="ee.jakarta.tck.json.bind.customizedmapping.ijson.IJsonSupportTest" name="testStrictBinaryDataEncoding" time="0.001">
<testcase classname="ee.jakarta.tck.json.bind.defaultmapping.basictypes.BasicJavaTypesMappingTest" name="testNumberMapping" time="0.001">
<testcase classname="ee.jakarta.tck.json.bind.defaultmapping.specifictypes.SpecificTypesMappingTest" name="testEmptyOptionalDoubleMapping" time="0.002">
<testcase classname="ee.jakarta.tck.json.bind.defaultmapping.specifictypes.SpecificTypesMappingTest" name="testEmptyOptionalMapping" time="0.002">
<testcase classname="ee.jakarta.tck.json.bind.defaultmapping.specifictypes.SpecificTypesMappingTest" name="testEmptyOptionalArrayMapping" time="0.002">
<testcase classname="ee.jakarta.tck.json.bind.defaultmapping.specifictypes.SpecificTypesMappingTest" name="testEmptyOptionalLongMapping" time="0.002">
<testcase classname="ee.jakarta.tck.json.bind.defaultmapping.specifictypes.SpecificTypesMappingTest" name="testEmptyOptionalIntMapping" time="0.001">
<testcase classname="ee.jakarta.tck.json.bind.defaultmapping.specifictypes.SpecificTypesMappingTest" name="testOptionalObjectMapping" time="0.002">

Due to assertions that assume that Charset.defaultCharset() will return UTF-8. For example (testToJsonObjectTypeWriter) fails with the following when run on z/OS with a default character encoding of IBM-1047:

Failed to marshal using Jsonb.toJson method with Object, Type and Writer arguments.
Expected: a string matching the pattern '\{\s*"instance"\s*:\s*"Test"\s*}'
but: was "���������zㅢ��"
at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:20)
at ee.jakarta.tck.json.bind.api.jsonb.JsonbTest.testToJsonObjectTypeWriter(JsonbTest.java:221) 

If we look at this test: https://github.com/jakartaee/jsonb-api/blob/master/tck/src/main/java/ee/jakarta/tck/json/bind/api/jsonb/JsonbTest.java#L215-L224

new OutputStreamWriter(stream) will return a Writer with a character encoding of IBM-1047. Then we try to create a string where the bytes are encoded using IBM-1047 but we decode it using UTF-8 resulting in: ���������zㅢ��