1 /* 2 * Copyright 2017-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. 3 */ 4 5 package kotlinx.serialization.json 6 7 import kotlinx.serialization.* 8 import kotlinx.serialization.test.* 9 import kotlin.test.* 10 11 class JsonParserFailureModesTest : JsonTestBase() { 12 13 @Serializable 14 data class Holder( 15 val id: Long 16 ) 17 18 @Test <lambda>null19 fun testFailureModes() = parametrizedTest { 20 assertFailsWithSerial("JsonDecodingException") { 21 default.decodeFromString( 22 Holder.serializer(), 23 """{"id": "}""", 24 it 25 ) 26 } 27 assertFailsWithSerial("JsonDecodingException") { 28 default.decodeFromString( 29 Holder.serializer(), 30 """{"id": ""}""", 31 it 32 ) 33 } 34 assertFailsWithSerial("JsonDecodingException") { 35 default.decodeFromString( 36 Holder.serializer(), 37 """{"id":a}""", 38 it 39 ) 40 } 41 assertFailsWithSerial("JsonDecodingException") { 42 default.decodeFromString( 43 Holder.serializer(), 44 """{"id":2.0}""", 45 it 46 ) 47 } 48 assertFailsWithSerial("JsonDecodingException") { 49 default.decodeFromString( 50 Holder.serializer(), 51 """{"id2":2}""", 52 it 53 ) 54 } 55 // 9223372036854775807 is Long.MAX_VALUE 56 assertFailsWithSerial("JsonDecodingException") { 57 default.decodeFromString( 58 Holder.serializer(), 59 """{"id":${Long.MAX_VALUE}""" + "00" + "}", 60 it 61 ) 62 } 63 // -9223372036854775808 is Long.MIN_VALUE 64 assertFailsWithSerial("JsonDecodingException") { 65 default.decodeFromString( 66 Holder.serializer(), 67 """{"id":9223372036854775808}""", 68 it 69 ) 70 } 71 assertFailsWithSerial("JsonDecodingException") { default.decodeFromString(Holder.serializer(), """{"id"}""", it) } 72 assertFailsWithSerial("JsonDecodingException") { default.decodeFromString(Holder.serializer(), """{"id}""", it) } 73 assertFailsWithSerial("JsonDecodingException") { default.decodeFromString(Holder.serializer(), """{"i}""", it) } 74 assertFailsWithSerial("JsonDecodingException") { default.decodeFromString(Holder.serializer(), """{"}""", it) } 75 assertFailsWithMissingField { default.decodeFromString(Holder.serializer(), """{}""", it) } 76 assertFailsWithSerial("JsonDecodingException") { default.decodeFromString(Holder.serializer(), """{""", it) } 77 assertFailsWithSerial("JsonDecodingException") { default.decodeFromString(Holder.serializer(), """}""", it) } 78 assertFailsWithSerial("JsonDecodingException") { default.decodeFromString(Holder.serializer(), """{""", it) } 79 } 80 81 @Serializable 82 class BooleanHolder(val b: Boolean) 83 84 @Test <lambda>null85 fun testBoolean() = parametrizedTest { 86 assertFailsWithSerial("JsonDecodingException") { 87 default.decodeFromString( 88 BooleanHolder.serializer(), 89 """{"b": fals}""", 90 it 91 ) 92 } 93 assertFailsWithSerial("JsonDecodingException") { 94 default.decodeFromString( 95 BooleanHolder.serializer(), 96 """{"b": 123}""", 97 it 98 ) 99 } 100 } 101 102 @Serializable 103 class PrimitiveHolder( 104 val b: Byte = 0, val s: Short = 0, val i: Int = 0 105 ) 106 107 @Test <lambda>null108 fun testOverflow() = parametrizedTest { 109 // Byte overflow 110 assertFailsWithSerial("JsonDecodingException") { default.decodeFromString<PrimitiveHolder>("""{"b": 128}""", it) } 111 // Short overflow 112 assertFailsWithSerial("JsonDecodingException") { default.decodeFromString<PrimitiveHolder>("""{"s": 32768}""", it) } 113 // Int overflow 114 assertFailsWithSerial("JsonDecodingException") { 115 default.decodeFromString<PrimitiveHolder>( 116 """{"i": 2147483648}""", 117 it 118 ) 119 } 120 } 121 122 @Test <lambda>null123 fun testNoOverflow() = parametrizedTest { 124 default.decodeFromString<PrimitiveHolder>("""{"b": ${Byte.MAX_VALUE}}""", it) 125 default.decodeFromString<PrimitiveHolder>("""{"b": ${Byte.MIN_VALUE}}""", it) 126 default.decodeFromString<PrimitiveHolder>("""{"s": ${Short.MAX_VALUE}}""", it) 127 default.decodeFromString<PrimitiveHolder>("""{"s": ${Short.MIN_VALUE}}""", it) 128 default.decodeFromString<PrimitiveHolder>("""{"i": ${Int.MAX_VALUE}}""", it) 129 default.decodeFromString<PrimitiveHolder>("""{"i": ${Int.MIN_VALUE}}""", it) 130 default.decodeFromString<Holder>("""{"id": ${Long.MIN_VALUE.toString()}}""", it) 131 default.decodeFromString<Holder>("""{"id": ${Long.MAX_VALUE.toString()}}""", it) 132 } 133 134 @Test <lambda>null135 fun testInvalidNumber() = parametrizedTest { 136 assertFailsWithSerial("JsonDecodingException") { default.decodeFromString<Holder>("""{"id":-}""", it) } 137 assertFailsWithSerial("JsonDecodingException") { default.decodeFromString<Holder>("""{"id":+}""", it) } 138 assertFailsWithSerial("JsonDecodingException") { default.decodeFromString<Holder>("""{"id":--}""", it) } 139 assertFailsWithSerial("JsonDecodingException") { default.decodeFromString<Holder>("""{"id":1-1}""", it) } 140 assertFailsWithSerial("JsonDecodingException") { default.decodeFromString<Holder>("""{"id":0-1}""", it) } 141 assertFailsWithSerial("JsonDecodingException") { default.decodeFromString<Holder>("""{"id":0-}""", it) } 142 assertFailsWithSerial("JsonDecodingException") { default.decodeFromString<Holder>("""{"id":a}""", it) } 143 assertFailsWithSerial("JsonDecodingException") { default.decodeFromString<Holder>("""{"id":-a}""", it) } 144 } 145 146 147 @Serializable 148 data class BooleanWrapper(val b: Boolean) 149 150 @Serializable 151 data class StringWrapper(val s: String) 152 153 @Test <lambda>null154 fun testUnexpectedNull() = parametrizedTest { 155 assertFailsWithSerial("JsonDecodingException") { default.decodeFromString<BooleanWrapper>("""{"b":{"b":"b"}}""", it) } 156 assertFailsWithSerial("JsonDecodingException") { default.decodeFromString<BooleanWrapper>("""{"b":null}""", it) } 157 assertFailsWithSerial("JsonDecodingException") { default.decodeFromString<StringWrapper>("""{"s":{"s":"s"}}""", it) } 158 assertFailsWithSerial("JsonDecodingException") { default.decodeFromString<StringWrapper>("""{"s":null}""", it) } 159 } 160 } 161