Utils.swift 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. /*
  2. * Copyright 2023, gRPC Authors All rights reserved.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. import Foundation
  17. import GRPC
  18. import SwiftProtobuf
  19. internal func makeExtensions(
  20. forType typeName: String,
  21. number: Int
  22. ) -> [Google_Protobuf_FieldDescriptorProto] {
  23. var extensions: [Google_Protobuf_FieldDescriptorProto] = []
  24. for id in 1 ... number {
  25. extensions.append(
  26. Google_Protobuf_FieldDescriptorProto.with {
  27. $0.name = "extension" + typeName + "-" + String(id)
  28. $0.extendee = typeName
  29. $0.number = Int32(id)
  30. }
  31. )
  32. }
  33. return extensions
  34. }
  35. internal func generateFileDescriptorProto(
  36. fileName name: String,
  37. suffix: String
  38. ) -> Google_Protobuf_FileDescriptorProto {
  39. let inputMessage = Google_Protobuf_DescriptorProto.with {
  40. $0.name = "inputMessage" + suffix
  41. $0.field = [
  42. Google_Protobuf_FieldDescriptorProto.with {
  43. $0.name = "inputField"
  44. $0.type = .bool
  45. }
  46. ]
  47. }
  48. let packageName = "package" + name + suffix
  49. let inputMessageExtensions = makeExtensions(
  50. forType: "." + packageName + "." + "inputMessage" + suffix,
  51. number: 5
  52. )
  53. let outputMessage = Google_Protobuf_DescriptorProto.with {
  54. $0.name = "outputMessage" + suffix
  55. $0.field = [
  56. Google_Protobuf_FieldDescriptorProto.with {
  57. $0.name = "outputField"
  58. $0.type = .int32
  59. }
  60. ]
  61. }
  62. let enumType = Google_Protobuf_EnumDescriptorProto.with {
  63. $0.name = "enumType" + suffix
  64. $0.value = [
  65. Google_Protobuf_EnumValueDescriptorProto.with {
  66. $0.name = "value1"
  67. },
  68. Google_Protobuf_EnumValueDescriptorProto.with {
  69. $0.name = "value2"
  70. },
  71. ]
  72. }
  73. let method = Google_Protobuf_MethodDescriptorProto.with {
  74. $0.name = "testMethod" + suffix
  75. $0.inputType = inputMessage.name
  76. $0.outputType = outputMessage.name
  77. }
  78. let serviceDescriptor = Google_Protobuf_ServiceDescriptorProto.with {
  79. $0.method = [method]
  80. $0.name = "service" + suffix
  81. }
  82. let fileDescriptorProto = Google_Protobuf_FileDescriptorProto.with {
  83. $0.service = [serviceDescriptor]
  84. $0.name = name + suffix + ".proto"
  85. $0.package = "package" + name + suffix
  86. $0.messageType = [inputMessage, outputMessage]
  87. $0.enumType = [enumType]
  88. $0.extension = inputMessageExtensions
  89. }
  90. return fileDescriptorProto
  91. }
  92. /// Creates the dependencies of the proto used in the testing context.
  93. internal func makeProtosWithDependencies() -> [Google_Protobuf_FileDescriptorProto] {
  94. var fileDependencies: [Google_Protobuf_FileDescriptorProto] = []
  95. for id in 1 ... 4 {
  96. let fileDescriptorProto = generateFileDescriptorProto(fileName: "bar", suffix: String(id))
  97. if id != 1 {
  98. // Dependency of the first dependency.
  99. fileDependencies[0].dependency.append(fileDescriptorProto.name)
  100. }
  101. fileDependencies.append(fileDescriptorProto)
  102. }
  103. return fileDependencies
  104. }
  105. internal func makeProtosWithComplexDependencies() -> [Google_Protobuf_FileDescriptorProto] {
  106. var protos: [Google_Protobuf_FileDescriptorProto] = []
  107. protos.append(generateFileDescriptorProto(fileName: "foo", suffix: "0"))
  108. for id in 1 ... 10 {
  109. let fileDescriptorProtoA = generateFileDescriptorProto(
  110. fileName: "fooA",
  111. suffix: String(id) + "A"
  112. )
  113. let fileDescriptorProtoB = generateFileDescriptorProto(
  114. fileName: "fooB",
  115. suffix: String(id) + "B"
  116. )
  117. let parent = protos.count > 1 ? protos.count - Int.random(in: 1 ..< 3) : protos.count - 1
  118. protos[parent].dependency.append(fileDescriptorProtoA.name)
  119. protos[parent].dependency.append(fileDescriptorProtoB.name)
  120. protos.append(fileDescriptorProtoA)
  121. protos.append(fileDescriptorProtoB)
  122. }
  123. return protos
  124. }
  125. extension Sequence where Element == Google_Protobuf_FileDescriptorProto {
  126. var serviceNames: [String] {
  127. self.flatMap { $0.service.map { $0.name } }
  128. }
  129. }
  130. extension Sequence where Element == Google_Protobuf_EnumDescriptorProto {
  131. var names: [String] {
  132. self.map { $0.name }
  133. }
  134. }