• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download

<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