<lambda>null1 package kotlinx.serialization.json
2
3 import kotlinx.serialization.*
4 import kotlinx.serialization.Serializable
5 import kotlinx.serialization.descriptors.*
6 import kotlinx.serialization.encoding.*
7 import kotlinx.serialization.test.assertFailsWithMessage
8 import kotlin.test.*
9
10
11 @Serializable(with = LargeStringSerializer::class)
12 data class LargeStringData(val largeString: String)
13
14 @Serializable
15 data class ClassWithLargeStringDataField(val largeStringField: LargeStringData)
16
17
18 object LargeStringSerializer : KSerializer<LargeStringData> {
19 override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("LargeStringContent", PrimitiveKind.STRING)
20
21 override fun deserialize(decoder: Decoder): LargeStringData {
22 require(decoder is ChunkedDecoder) { "Only chunked decoder supported" }
23
24 val outStringBuilder = StringBuilder()
25
26 decoder.decodeStringChunked { chunk ->
27 outStringBuilder.append(chunk)
28 }
29 return LargeStringData(outStringBuilder.toString())
30 }
31
32 override fun serialize(encoder: Encoder, value: LargeStringData) {
33 encoder.encodeString(value.largeString)
34 }
35 }
36
37 open class JsonChunkedStringDecoderTest : JsonTestBase() {
38
39 @Test
decodePlainLenientStringnull40 fun decodePlainLenientString() {
41 val longString = "abcd".repeat(8192) // Make string more than 16k
42 val sourceObject = ClassWithLargeStringDataField(LargeStringData(longString))
43 val serializedObject = "{\"largeStringField\": $longString }"
44 val jsonWithLenientMode = Json { isLenient = true }
45 testDecodeInAllModes(jsonWithLenientMode, serializedObject, sourceObject)
46 }
47
48 @Test
decodePlainStringnull49 fun decodePlainString() {
50 val longStringWithEscape = "${"abcd".repeat(4096)}\"${"abcd".repeat(4096)}" // Make string more than 16k
51 val sourceObject = ClassWithLargeStringDataField(LargeStringData(longStringWithEscape))
52 val serializedObject = Json.encodeToString(sourceObject)
53 testDecodeInAllModes(Json, serializedObject, sourceObject)
54 }
55
testDecodeInAllModesnull56 private fun testDecodeInAllModes(
57 seralizer: Json, serializedObject: String, sourceObject: ClassWithLargeStringDataField
58 ) {
59 /* Filter out Java Streams mode in common tests. Java streams tested separately in java tests */
60 JsonTestingMode.values().filterNot { it == JsonTestingMode.JAVA_STREAMS }.forEach { mode ->
61 if (mode == JsonTestingMode.TREE) {
62 assertFailsWithMessage<IllegalArgumentException>(
63 "Only chunked decoder supported", "Shouldn't decode JSON in TREE mode"
64 ) {
65 seralizer.decodeFromString<ClassWithLargeStringDataField>(serializedObject, mode)
66 }
67 } else {
68 val deserializedObject =
69 seralizer.decodeFromString<ClassWithLargeStringDataField>(serializedObject, mode)
70 assertEquals(sourceObject.largeStringField, deserializedObject.largeStringField)
71 }
72 }
73 }
74 }
75