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