summaryrefslogtreecommitdiff
path: root/formats/json-tests/commonTest/src/kotlinx/serialization/json/JsonChunkedStringDecoderTest.kt
diff options
context:
space:
mode:
Diffstat (limited to 'formats/json-tests/commonTest/src/kotlinx/serialization/json/JsonChunkedStringDecoderTest.kt')
-rw-r--r--formats/json-tests/commonTest/src/kotlinx/serialization/json/JsonChunkedStringDecoderTest.kt74
1 files changed, 74 insertions, 0 deletions
diff --git a/formats/json-tests/commonTest/src/kotlinx/serialization/json/JsonChunkedStringDecoderTest.kt b/formats/json-tests/commonTest/src/kotlinx/serialization/json/JsonChunkedStringDecoderTest.kt
new file mode 100644
index 00000000..fca258fb
--- /dev/null
+++ b/formats/json-tests/commonTest/src/kotlinx/serialization/json/JsonChunkedStringDecoderTest.kt
@@ -0,0 +1,74 @@
+package kotlinx.serialization.json
+
+import kotlinx.serialization.*
+import kotlinx.serialization.Serializable
+import kotlinx.serialization.descriptors.*
+import kotlinx.serialization.encoding.*
+import kotlinx.serialization.test.assertFailsWithMessage
+import kotlin.test.*
+
+
+@Serializable(with = LargeStringSerializer::class)
+data class LargeStringData(val largeString: String)
+
+@Serializable
+data class ClassWithLargeStringDataField(val largeStringField: LargeStringData)
+
+
+object LargeStringSerializer : KSerializer<LargeStringData> {
+ override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("LargeStringContent", PrimitiveKind.STRING)
+
+ override fun deserialize(decoder: Decoder): LargeStringData {
+ require(decoder is ChunkedDecoder) { "Only chunked decoder supported" }
+
+ val outStringBuilder = StringBuilder()
+
+ decoder.decodeStringChunked { chunk ->
+ outStringBuilder.append(chunk)
+ }
+ return LargeStringData(outStringBuilder.toString())
+ }
+
+ override fun serialize(encoder: Encoder, value: LargeStringData) {
+ encoder.encodeString(value.largeString)
+ }
+}
+
+open class JsonChunkedStringDecoderTest : JsonTestBase() {
+
+ @Test
+ fun decodePlainLenientString() {
+ val longString = "abcd".repeat(8192) // Make string more than 16k
+ val sourceObject = ClassWithLargeStringDataField(LargeStringData(longString))
+ val serializedObject = "{\"largeStringField\": $longString }"
+ val jsonWithLenientMode = Json { isLenient = true }
+ testDecodeInAllModes(jsonWithLenientMode, serializedObject, sourceObject)
+ }
+
+ @Test
+ fun decodePlainString() {
+ val longStringWithEscape = "${"abcd".repeat(4096)}\"${"abcd".repeat(4096)}" // Make string more than 16k
+ val sourceObject = ClassWithLargeStringDataField(LargeStringData(longStringWithEscape))
+ val serializedObject = Json.encodeToString(sourceObject)
+ testDecodeInAllModes(Json, serializedObject, sourceObject)
+ }
+
+ private fun testDecodeInAllModes(
+ seralizer: Json, serializedObject: String, sourceObject: ClassWithLargeStringDataField
+ ) {
+ /* Filter out Java Streams mode in common tests. Java streams tested separately in java tests */
+ JsonTestingMode.values().filterNot { it == JsonTestingMode.JAVA_STREAMS }.forEach { mode ->
+ if (mode == JsonTestingMode.TREE) {
+ assertFailsWithMessage<IllegalArgumentException>(
+ "Only chunked decoder supported", "Shouldn't decode JSON in TREE mode"
+ ) {
+ seralizer.decodeFromString<ClassWithLargeStringDataField>(serializedObject, mode)
+ }
+ } else {
+ val deserializedObject =
+ seralizer.decodeFromString<ClassWithLargeStringDataField>(serializedObject, mode)
+ assertEquals(sourceObject.largeStringField, deserializedObject.largeStringField)
+ }
+ }
+ }
+}