1 package kotlinx.serialization.protobuf.schema
2 
3 import kotlinx.serialization.*
4 import kotlinx.serialization.protobuf.*
5 import kotlin.test.Test
6 import kotlin.test.assertFailsWith
7 
8 class SchemaValidationsTest {
9     @Serializable
10     data class ValidClass(val i: Int)
11 
12     @Serializable
13     @SerialName("ValidClass")
14     data class DuplicateClass(val l: Long)
15 
16     @Serializable
17     @SerialName("invalid serial name")
18     data class InvalidClassName(val i: Int)
19 
20     @Serializable
21     data class InvalidClassFieldName(@SerialName("invalid serial name") val i: Int)
22 
23     @Serializable
24     data class FieldNumberDuplicates(@ProtoNumber(42) val i: Int, @ProtoNumber(42) val j: Int)
25 
26     @Serializable
27     data class FieldNumberImplicitlyDuplicates(@ProtoNumber(2) val i: Int, val j: Int)
28 
29     @Serializable
30     @SerialName("invalid serial name")
31     enum class InvalidEnumName { SINGLETON }
32 
33     @Serializable
34     enum class InvalidEnumElementName {
35         FIRST,
36 
37         @SerialName("invalid serial name")
38         SECOND
39     }
40 
41     @Serializable
42     enum class EnumWithExplicitProtoNumberDuplicate {
43         @ProtoNumber(2)
44         FIRST,
45         @ProtoNumber(2)
46         SECOND,
47     }
48 
49     @Serializable
50     enum class EnumWithImplicitProtoNumberDuplicate {
51         FIRST,
52         @ProtoNumber(0)
53         SECOND,
54     }
55 
56     @Test
testExplicitDuplicateEnumElementProtoNumbernull57     fun testExplicitDuplicateEnumElementProtoNumber() {
58         val descriptors = listOf(EnumWithExplicitProtoNumberDuplicate.serializer().descriptor)
59         assertFailsWith(IllegalArgumentException::class) { ProtoBufSchemaGenerator.generateSchemaText(descriptors) }
60     }
61 
62     @Test
testImplicitDuplicateEnumElementProtoNumbernull63     fun testImplicitDuplicateEnumElementProtoNumber() {
64         val descriptors = listOf(EnumWithImplicitProtoNumberDuplicate.serializer().descriptor)
65         assertFailsWith(IllegalArgumentException::class) { ProtoBufSchemaGenerator.generateSchemaText(descriptors) }
66     }
67 
68     @Test
testInvalidEnumElementSerialNamenull69     fun testInvalidEnumElementSerialName() {
70         val descriptors = listOf(InvalidEnumElementName.serializer().descriptor)
71         assertFailsWith(IllegalArgumentException::class) { ProtoBufSchemaGenerator.generateSchemaText(descriptors) }
72     }
73 
74     @Test
testInvalidClassSerialNamenull75     fun testInvalidClassSerialName() {
76         val descriptors = listOf(InvalidClassName.serializer().descriptor)
77         assertFailsWith(IllegalArgumentException::class) { ProtoBufSchemaGenerator.generateSchemaText(descriptors) }
78     }
79 
80     @Test
testInvalidClassFieldSerialNamenull81     fun testInvalidClassFieldSerialName() {
82         val descriptors = listOf(InvalidClassFieldName.serializer().descriptor)
83         assertFailsWith(IllegalArgumentException::class) { ProtoBufSchemaGenerator.generateSchemaText(descriptors) }
84     }
85 
86     @Test
testDuplicateSerialNamesnull87     fun testDuplicateSerialNames() {
88         val descriptors = listOf(InvalidClassFieldName.serializer().descriptor)
89         assertFailsWith(IllegalArgumentException::class) { ProtoBufSchemaGenerator.generateSchemaText(descriptors) }
90     }
91 
92     @Test
testInvalidEnumSerialNamenull93     fun testInvalidEnumSerialName() {
94         val descriptors = listOf(InvalidEnumName.serializer().descriptor)
95         assertFailsWith(IllegalArgumentException::class) { ProtoBufSchemaGenerator.generateSchemaText(descriptors) }
96     }
97 
98     @Test
testDuplicationSerialNamenull99     fun testDuplicationSerialName() {
100         val descriptors = listOf(ValidClass.serializer().descriptor, DuplicateClass.serializer().descriptor)
101         assertFailsWith(IllegalArgumentException::class) { ProtoBufSchemaGenerator.generateSchemaText(descriptors) }
102     }
103 
104     @Test
testInvalidOptionNamenull105     fun testInvalidOptionName() {
106         val descriptors = listOf(ValidClass.serializer().descriptor)
107         assertFailsWith(IllegalArgumentException::class) {
108             ProtoBufSchemaGenerator.generateSchemaText(
109                 descriptors,
110                 options = mapOf("broken name" to "value")
111             )
112         }
113     }
114 
115     @Test
testIllegalPackageNamesnull116     fun testIllegalPackageNames() {
117         val descriptors = listOf(ValidClass.serializer().descriptor)
118         assertFailsWith(IllegalArgumentException::class) { ProtoBufSchemaGenerator.generateSchemaText(descriptors, "") }
119         assertFailsWith(IllegalArgumentException::class) { ProtoBufSchemaGenerator.generateSchemaText(descriptors, ".") }
120         assertFailsWith(IllegalArgumentException::class) { ProtoBufSchemaGenerator.generateSchemaText(descriptors, ".first.dot") }
121         assertFailsWith(IllegalArgumentException::class) { ProtoBufSchemaGenerator.generateSchemaText(descriptors, "ended.with.dot.") }
122         assertFailsWith(IllegalArgumentException::class) { ProtoBufSchemaGenerator.generateSchemaText(descriptors, "first._underscore") }
123         assertFailsWith(IllegalArgumentException::class) { ProtoBufSchemaGenerator.generateSchemaText(descriptors, "first.1digit") }
124         assertFailsWith(IllegalArgumentException::class) { ProtoBufSchemaGenerator.generateSchemaText(descriptors, "illegal.sym+bol") }
125     }
126 
127     @Test
testValidPackageNamesnull128     fun testValidPackageNames() {
129         val descriptors = listOf(ValidClass.serializer().descriptor)
130         ProtoBufSchemaGenerator.generateSchemaText(descriptors, "singleIdent")
131         ProtoBufSchemaGenerator.generateSchemaText(descriptors, "double.ident")
132         ProtoBufSchemaGenerator.generateSchemaText(descriptors, "with.digits0123")
133         ProtoBufSchemaGenerator.generateSchemaText(descriptors, "with.underscore_")
134     }
135 
136     @Test
testFieldNumberDuplicatesnull137     fun testFieldNumberDuplicates() {
138         assertFailsWith(IllegalArgumentException::class) { ProtoBufSchemaGenerator.generateSchemaText(listOf(FieldNumberDuplicates.serializer().descriptor)) }
139         assertFailsWith(IllegalArgumentException::class) { ProtoBufSchemaGenerator.generateSchemaText(listOf(FieldNumberImplicitlyDuplicates.serializer().descriptor)) }
140     }
141 }
142