Connection+Equatable.swift 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. /*
  2. * Copyright 2024, 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 GRPCCore
  17. import GRPCHTTP2Core
  18. // Equatable conformance for these types is 'best effort', this is sufficient for testing but not
  19. // for general use.
  20. @available(macOS 15.0, iOS 18.0, watchOS 11.0, tvOS 18.0, visionOS 2.0, *)
  21. extension Connection.Event: Equatable {}
  22. @available(macOS 15.0, iOS 18.0, watchOS 11.0, tvOS 18.0, visionOS 2.0, *)
  23. extension Connection.CloseReason: Equatable {}
  24. extension ClientConnectionEvent: Equatable {}
  25. extension ClientConnectionEvent.CloseReason: Equatable {}
  26. @available(macOS 15.0, iOS 18.0, watchOS 11.0, tvOS 18.0, visionOS 2.0, *)
  27. extension Connection.Event {
  28. package static func == (lhs: Connection.Event, rhs: Connection.Event) -> Bool {
  29. switch (lhs, rhs) {
  30. case (.connectSucceeded, .connectSucceeded),
  31. (.connectFailed, .connectFailed):
  32. return true
  33. case (.goingAway(let lhsCode, let lhsReason), .goingAway(let rhsCode, let rhsReason)):
  34. return lhsCode == rhsCode && lhsReason == rhsReason
  35. case (.closed(let lhsReason), .closed(let rhsReason)):
  36. return lhsReason == rhsReason
  37. default:
  38. return false
  39. }
  40. }
  41. }
  42. @available(macOS 15.0, iOS 18.0, watchOS 11.0, tvOS 18.0, visionOS 2.0, *)
  43. extension Connection.CloseReason {
  44. package static func == (lhs: Connection.CloseReason, rhs: Connection.CloseReason) -> Bool {
  45. switch (lhs, rhs) {
  46. case (.idleTimeout, .idleTimeout),
  47. (.keepaliveTimeout, .keepaliveTimeout),
  48. (.initiatedLocally, .initiatedLocally),
  49. (.remote, .remote):
  50. return true
  51. case (.error(let lhsError, let lhsStreams), .error(let rhsError, let rhsStreams)):
  52. if let lhs = lhsError as? RPCError, let rhs = rhsError as? RPCError {
  53. return lhs == rhs && lhsStreams == rhsStreams
  54. } else {
  55. return lhsStreams == rhsStreams
  56. }
  57. default:
  58. return false
  59. }
  60. }
  61. }
  62. extension ClientConnectionEvent {
  63. package static func == (lhs: ClientConnectionEvent, rhs: ClientConnectionEvent) -> Bool {
  64. switch (lhs, rhs) {
  65. case (.ready, .ready):
  66. return true
  67. case (.closing(let lhsReason), .closing(let rhsReason)):
  68. return lhsReason == rhsReason
  69. default:
  70. return false
  71. }
  72. }
  73. }
  74. extension ClientConnectionEvent.CloseReason {
  75. package static func == (lhs: Self, rhs: Self) -> Bool {
  76. switch (lhs, rhs) {
  77. case (.goAway(let lhsCode, let lhsMessage), .goAway(let rhsCode, let rhsMessage)):
  78. return lhsCode == rhsCode && lhsMessage == rhsMessage
  79. case (.unexpected(let lhsError, let lhsIsIdle), .unexpected(let rhsError, let rhsIsIdle)):
  80. if let lhs = lhsError as? RPCError, let rhs = rhsError as? RPCError {
  81. return lhs == rhs && lhsIsIdle == rhsIsIdle
  82. } else {
  83. return lhsIsIdle == rhsIsIdle
  84. }
  85. case (.keepaliveExpired, .keepaliveExpired),
  86. (.idle, .idle),
  87. (.initiatedLocally, .initiatedLocally):
  88. return true
  89. default:
  90. return false
  91. }
  92. }
  93. }