Skip to content

Commit 24af779

Browse files
committed
Don't accept null for standard enums
Test repeated standard enums to verify that they don't accept `null` within the array list.
1 parent 11ff813 commit 24af779

File tree

3 files changed

+33
-3
lines changed

3 files changed

+33
-3
lines changed

Sources/SwiftProtobuf/JSONDecoder.swift

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -501,10 +501,19 @@ internal struct JSONDecoder: Decoder {
501501
if scanner.skipOptionalArrayEnd() {
502502
return
503503
}
504+
let maybeCustomDecodable = E.self as? _CustomJSONCodable.Type
504505
while true {
505-
var e = E()
506-
try decodeSingularEnumField(value: &e)
507-
value.append(e)
506+
if scanner.skipOptionalNull() {
507+
if let customDecodable = maybeCustomDecodable {
508+
let e = try customDecodable.decodedFromJSONNull() as! E
509+
value.append(e)
510+
} else {
511+
throw JSONDecodingError.illegalNull
512+
}
513+
} else {
514+
let e: E = try scanner.nextEnumValue()
515+
value.append(e)
516+
}
508517
if scanner.skipOptionalArrayEnd() {
509518
return
510519
}

Tests/LinuxMain.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -582,6 +582,7 @@ extension Test_JSON {
582582
("testRepeatedInt32", testRepeatedInt32),
583583
("testRepeatedString", testRepeatedString),
584584
("testRepeatedNestedMessage", testRepeatedNestedMessage),
585+
("testRepeatedEnum", testRepeatedEnum),
585586
("testOneof", testOneof),
586587
("testEmptyMessage", testEmptyMessage)
587588
]

Tests/SwiftProtobufTests/Test_JSON.swift

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -876,6 +876,26 @@ class Test_JSON: XCTestCase, PBTestHelpers {
876876
}
877877
}
878878

879+
func testRepeatedEnum() {
880+
assertJSONEncode("{\"repeatedNestedEnum\":[\"FOO\"]}") {(o: inout MessageTestType) in
881+
o.repeatedNestedEnum = [.foo]
882+
}
883+
assertJSONEncode("{\"repeatedNestedEnum\":[\"FOO\",\"BAR\"]}") {(o: inout MessageTestType) in
884+
o.repeatedNestedEnum = [.foo, .bar]
885+
}
886+
assertJSONDecodeSucceeds("{\"repeatedNestedEnum\":[\"FOO\",0,1,\"BAR\",-1]}") {(o:MessageTestType) in
887+
o.repeatedNestedEnum == [.foo, .zero, .foo, .bar, .neg]
888+
}
889+
assertJSONDecodeFails("{\"repeatedNestedEnum\":[null]}")
890+
assertJSONDecodeFails("{\"repeatedNestedEnum\":\"FOO\"}")
891+
assertJSONDecodeFails("{\"repeatedNestedEnum\":0}")
892+
assertJSONDecodeSucceeds("{\"repeatedNestedEnum\":null}") {(o:MessageTestType) in
893+
o.repeatedNestedEnum == []
894+
}
895+
assertJSONDecodeSucceeds("{\"repeatedNestedEnum\":[]}") {(o:MessageTestType) in
896+
o.repeatedNestedEnum == []
897+
}
898+
}
879899

880900
// TODO: Test other repeated field types
881901

0 commit comments

Comments
 (0)