• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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