Utils.swift 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347
  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. import XCTest
  20. internal func makeExtensions(
  21. forType typeName: String,
  22. number: Int
  23. ) -> [Google_Protobuf_FieldDescriptorProto] {
  24. var extensions: [Google_Protobuf_FieldDescriptorProto] = []
  25. for id in 1 ... number {
  26. extensions.append(
  27. Google_Protobuf_FieldDescriptorProto.with {
  28. $0.name = "extension" + typeName + "-" + String(id)
  29. $0.extendee = typeName
  30. $0.number = Int32(id)
  31. }
  32. )
  33. }
  34. return extensions
  35. }
  36. internal func generateFileDescriptorProto(
  37. fileName name: String,
  38. suffix: String
  39. ) -> Google_Protobuf_FileDescriptorProto {
  40. let inputMessage = Google_Protobuf_DescriptorProto.with {
  41. $0.name = "inputMessage" + suffix
  42. $0.field = [
  43. Google_Protobuf_FieldDescriptorProto.with {
  44. $0.name = "inputField"
  45. $0.type = .bool
  46. }
  47. ]
  48. }
  49. let packageName = "package" + name + suffix
  50. let inputMessageExtensions = makeExtensions(
  51. forType: "." + packageName + "." + "inputMessage" + suffix,
  52. number: 5
  53. )
  54. let outputMessage = Google_Protobuf_DescriptorProto.with {
  55. $0.name = "outputMessage" + suffix
  56. $0.field = [
  57. Google_Protobuf_FieldDescriptorProto.with {
  58. $0.name = "outputField"
  59. $0.type = .int32
  60. }
  61. ]
  62. }
  63. let enumType = Google_Protobuf_EnumDescriptorProto.with {
  64. $0.name = "enumType" + suffix
  65. $0.value = [
  66. Google_Protobuf_EnumValueDescriptorProto.with {
  67. $0.name = "value1"
  68. },
  69. Google_Protobuf_EnumValueDescriptorProto.with {
  70. $0.name = "value2"
  71. },
  72. ]
  73. }
  74. let method = Google_Protobuf_MethodDescriptorProto.with {
  75. $0.name = "testMethod" + suffix
  76. $0.inputType = inputMessage.name
  77. $0.outputType = outputMessage.name
  78. }
  79. let serviceDescriptor = Google_Protobuf_ServiceDescriptorProto.with {
  80. $0.method = [method]
  81. $0.name = "service" + suffix
  82. }
  83. let fileDescriptorProto = Google_Protobuf_FileDescriptorProto.with {
  84. $0.service = [serviceDescriptor]
  85. $0.name = name + suffix + ".proto"
  86. $0.package = "package" + name + suffix
  87. $0.messageType = [inputMessage, outputMessage]
  88. $0.enumType = [enumType]
  89. $0.extension = inputMessageExtensions
  90. }
  91. return fileDescriptorProto
  92. }
  93. /// Creates the dependencies of the proto used in the testing context.
  94. internal func makeProtosWithDependencies() -> [Google_Protobuf_FileDescriptorProto] {
  95. var fileDependencies: [Google_Protobuf_FileDescriptorProto] = []
  96. for id in 1 ... 4 {
  97. let fileDescriptorProto = generateFileDescriptorProto(fileName: "bar", suffix: String(id))
  98. if id != 1 {
  99. // Dependency of the first dependency.
  100. fileDependencies[0].dependency.append(fileDescriptorProto.name)
  101. }
  102. fileDependencies.append(fileDescriptorProto)
  103. }
  104. return fileDependencies
  105. }
  106. internal func makeProtosWithComplexDependencies() -> [Google_Protobuf_FileDescriptorProto] {
  107. var protos: [Google_Protobuf_FileDescriptorProto] = []
  108. protos.append(generateFileDescriptorProto(fileName: "foo", suffix: "0"))
  109. for id in 1 ... 10 {
  110. let fileDescriptorProtoA = generateFileDescriptorProto(
  111. fileName: "fooA",
  112. suffix: String(id) + "A"
  113. )
  114. let fileDescriptorProtoB = generateFileDescriptorProto(
  115. fileName: "fooB",
  116. suffix: String(id) + "B"
  117. )
  118. let parent = protos.count > 1 ? protos.count - Int.random(in: 1 ..< 3) : protos.count - 1
  119. protos[parent].dependency.append(fileDescriptorProtoA.name)
  120. protos[parent].dependency.append(fileDescriptorProtoB.name)
  121. protos.append(fileDescriptorProtoA)
  122. protos.append(fileDescriptorProtoB)
  123. }
  124. return protos
  125. }
  126. func XCTAssertThrowsGRPCStatus<T>(
  127. _ expression: @autoclosure () throws -> T,
  128. _ errorHandler: (GRPCStatus) -> Void
  129. ) {
  130. XCTAssertThrowsError(try expression()) { error in
  131. guard let error = error as? GRPCStatus else {
  132. return XCTFail("Error had unexpected type '\(type(of: error))'")
  133. }
  134. errorHandler(error)
  135. }
  136. }
  137. extension Google_Protobuf_FileDescriptorProto {
  138. var qualifiedServiceNames: [String] {
  139. self.service.map { self.package + "." + $0.name }
  140. }
  141. }
  142. extension Sequence where Element == Google_Protobuf_EnumDescriptorProto {
  143. var names: [String] {
  144. self.map { $0.name }
  145. }
  146. }
  147. extension Grpc_Reflection_V1_ExtensionRequest {
  148. init(_ v1AlphaExtensionRequest: Grpc_Reflection_V1alpha_ExtensionRequest) {
  149. self = .with {
  150. $0.containingType = v1AlphaExtensionRequest.containingType
  151. $0.extensionNumber = v1AlphaExtensionRequest.extensionNumber
  152. $0.unknownFields = v1AlphaExtensionRequest.unknownFields
  153. }
  154. }
  155. }
  156. extension Grpc_Reflection_V1_ServerReflectionRequest.OneOf_MessageRequest? {
  157. init(_ v1AlphaRequest: Grpc_Reflection_V1alpha_ServerReflectionRequest) {
  158. guard let messageRequest = v1AlphaRequest.messageRequest else {
  159. self = nil
  160. return
  161. }
  162. switch messageRequest {
  163. case .allExtensionNumbersOfType(let typeName):
  164. self = .allExtensionNumbersOfType(typeName)
  165. case .fileByFilename(let fileName):
  166. self = .fileByFilename(fileName)
  167. case .fileContainingSymbol(let symbol):
  168. self = .fileContainingSymbol(symbol)
  169. case .fileContainingExtension(let v1AlphaExtensionRequest):
  170. self = .fileContainingExtension(
  171. Grpc_Reflection_V1_ExtensionRequest(v1AlphaExtensionRequest)
  172. )
  173. case .listServices(let parameter):
  174. self = .listServices(parameter)
  175. }
  176. }
  177. }
  178. extension Grpc_Reflection_V1_ServerReflectionRequest {
  179. init(_ v1AlphaRequest: Grpc_Reflection_V1alpha_ServerReflectionRequest) {
  180. self = .with {
  181. $0.host = v1AlphaRequest.host
  182. $0.messageRequest = Grpc_Reflection_V1_ServerReflectionRequest.OneOf_MessageRequest?(
  183. v1AlphaRequest
  184. )
  185. }
  186. }
  187. }
  188. extension Grpc_Reflection_V1_FileDescriptorResponse {
  189. init(_ v1AlphaFileDescriptorResponse: Grpc_Reflection_V1alpha_FileDescriptorResponse) {
  190. self = .with {
  191. $0.fileDescriptorProto = v1AlphaFileDescriptorResponse.fileDescriptorProto
  192. $0.unknownFields = v1AlphaFileDescriptorResponse.unknownFields
  193. }
  194. }
  195. }
  196. extension Grpc_Reflection_V1_ExtensionNumberResponse {
  197. init(_ v1AlphaExtensionNumberResponse: Grpc_Reflection_V1alpha_ExtensionNumberResponse) {
  198. self = .with {
  199. $0.baseTypeName = v1AlphaExtensionNumberResponse.baseTypeName
  200. $0.extensionNumber = v1AlphaExtensionNumberResponse.extensionNumber
  201. $0.unknownFields = v1AlphaExtensionNumberResponse.unknownFields
  202. }
  203. }
  204. }
  205. extension Grpc_Reflection_V1_ServiceResponse {
  206. init(_ v1AlphaServiceResponse: Grpc_Reflection_V1alpha_ServiceResponse) {
  207. self = .with {
  208. $0.name = v1AlphaServiceResponse.name
  209. $0.unknownFields = v1AlphaServiceResponse.unknownFields
  210. }
  211. }
  212. }
  213. extension Grpc_Reflection_V1_ListServiceResponse {
  214. init(_ v1AlphaListServicesResponse: Grpc_Reflection_V1alpha_ListServiceResponse) {
  215. self = .with {
  216. $0.service = v1AlphaListServicesResponse.service.map {
  217. Grpc_Reflection_V1_ServiceResponse($0)
  218. }
  219. $0.unknownFields = v1AlphaListServicesResponse.unknownFields
  220. }
  221. }
  222. }
  223. extension Grpc_Reflection_V1_ErrorResponse {
  224. init(_ v1AlphaErrorResponse: Grpc_Reflection_V1alpha_ErrorResponse) {
  225. self = .with {
  226. $0.errorCode = v1AlphaErrorResponse.errorCode
  227. $0.errorMessage = v1AlphaErrorResponse.errorMessage
  228. $0.unknownFields = v1AlphaErrorResponse.unknownFields
  229. }
  230. }
  231. }
  232. extension Grpc_Reflection_V1_ServerReflectionResponse.OneOf_MessageResponse? {
  233. init(_ v1AlphaResponse: Grpc_Reflection_V1alpha_ServerReflectionResponse) {
  234. guard let messageRequest = v1AlphaResponse.messageResponse else {
  235. self = nil
  236. return
  237. }
  238. switch messageRequest {
  239. case .fileDescriptorResponse(let v1AlphaFileDescriptorResponse):
  240. self = .fileDescriptorResponse(
  241. Grpc_Reflection_V1_FileDescriptorResponse(
  242. v1AlphaFileDescriptorResponse
  243. )
  244. )
  245. case .allExtensionNumbersResponse(let v1AlphaAllExtensionNumbersResponse):
  246. self = .allExtensionNumbersResponse(
  247. Grpc_Reflection_V1_ExtensionNumberResponse(
  248. v1AlphaAllExtensionNumbersResponse
  249. )
  250. )
  251. case .listServicesResponse(let v1AlphaListServicesResponse):
  252. self = .listServicesResponse(
  253. Grpc_Reflection_V1_ListServiceResponse(
  254. v1AlphaListServicesResponse
  255. )
  256. )
  257. case .errorResponse(let v1AlphaErrorResponse):
  258. self = .errorResponse(
  259. Grpc_Reflection_V1_ErrorResponse(v1AlphaErrorResponse)
  260. )
  261. }
  262. }
  263. }
  264. extension Grpc_Reflection_V1_ServerReflectionResponse {
  265. init(_ v1AlphaResponse: Grpc_Reflection_V1alpha_ServerReflectionResponse) {
  266. self = .with {
  267. $0.validHost = v1AlphaResponse.validHost
  268. $0.originalRequest = Grpc_Reflection_V1_ServerReflectionRequest(
  269. v1AlphaResponse.originalRequest
  270. )
  271. $0.messageResponse = Grpc_Reflection_V1_ServerReflectionResponse.OneOf_MessageResponse?(
  272. v1AlphaResponse
  273. )
  274. }
  275. }
  276. }
  277. extension Grpc_Reflection_V1alpha_ExtensionRequest {
  278. init(_ v1ExtensionRequest: Grpc_Reflection_V1_ExtensionRequest) {
  279. self = .with {
  280. $0.containingType = v1ExtensionRequest.containingType
  281. $0.extensionNumber = v1ExtensionRequest.extensionNumber
  282. $0.unknownFields = v1ExtensionRequest.unknownFields
  283. }
  284. }
  285. }
  286. extension Grpc_Reflection_V1alpha_ServerReflectionRequest.OneOf_MessageRequest? {
  287. init(_ v1Request: Grpc_Reflection_V1_ServerReflectionRequest) {
  288. guard let messageRequest = v1Request.messageRequest else {
  289. self = nil
  290. return
  291. }
  292. switch messageRequest {
  293. case .allExtensionNumbersOfType(let typeName):
  294. self = .allExtensionNumbersOfType(typeName)
  295. case .fileByFilename(let fileName):
  296. self = .fileByFilename(fileName)
  297. case .fileContainingSymbol(let symbol):
  298. self = .fileContainingSymbol(symbol)
  299. case .fileContainingExtension(let v1ExtensionRequest):
  300. self = .fileContainingExtension(
  301. Grpc_Reflection_V1alpha_ExtensionRequest(v1ExtensionRequest)
  302. )
  303. case .listServices(let parameter):
  304. self = .listServices(parameter)
  305. }
  306. }
  307. }
  308. extension Grpc_Reflection_V1alpha_ServerReflectionRequest {
  309. init(_ v1Request: Grpc_Reflection_V1_ServerReflectionRequest) {
  310. self = .with {
  311. $0.host = v1Request.host
  312. $0.messageRequest = Grpc_Reflection_V1alpha_ServerReflectionRequest.OneOf_MessageRequest?(
  313. v1Request
  314. )
  315. }
  316. }
  317. }