MetadataTests.swift 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  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 GRPCCore
  17. import XCTest
  18. final class MetadataTests: XCTestCase {
  19. func testAddStringValue() {
  20. var metadata = Metadata()
  21. XCTAssertTrue(metadata.isEmpty)
  22. metadata.addString("testValue", forKey: "testString")
  23. XCTAssertEqual(metadata.count, 1)
  24. let sequence = metadata[stringValues: "testString"]
  25. var iterator = sequence.makeIterator()
  26. XCTAssertEqual(iterator.next(), "testValue")
  27. XCTAssertNil(iterator.next())
  28. }
  29. func testAddBinaryValue() {
  30. var metadata = Metadata()
  31. XCTAssertTrue(metadata.isEmpty)
  32. metadata.addBinary(Array("base64encodedString".utf8), forKey: "testBinary-bin")
  33. XCTAssertEqual(metadata.count, 1)
  34. let sequence = metadata[binaryValues: "testBinary-bin"]
  35. var iterator = sequence.makeIterator()
  36. XCTAssertEqual(iterator.next(), Array("base64encodedString".utf8))
  37. XCTAssertNil(iterator.next())
  38. }
  39. func testCreateFromDictionaryLiteral() {
  40. let metadata: Metadata = [
  41. "testKey": "stringValue",
  42. "testKey-bin": .binary(Array("base64encodedString".utf8)),
  43. ]
  44. XCTAssertEqual(metadata.count, 2)
  45. let stringSequence = metadata[stringValues: "testKey"]
  46. var stringIterator = stringSequence.makeIterator()
  47. XCTAssertEqual(stringIterator.next(), "stringValue")
  48. XCTAssertNil(stringIterator.next())
  49. let binarySequence = metadata[binaryValues: "testKey-bin"]
  50. var binaryIterator = binarySequence.makeIterator()
  51. XCTAssertEqual(binaryIterator.next(), Array("base64encodedString".utf8))
  52. XCTAssertNil(binaryIterator.next())
  53. }
  54. func testReplaceOrAddValue() {
  55. var metadata: Metadata = [
  56. "testKey": "value1",
  57. "testKey": "value2",
  58. ]
  59. XCTAssertEqual(metadata.count, 2)
  60. var sequence = metadata[stringValues: "testKey"]
  61. var iterator = sequence.makeIterator()
  62. XCTAssertEqual(iterator.next(), "value1")
  63. XCTAssertEqual(iterator.next(), "value2")
  64. XCTAssertNil(iterator.next())
  65. metadata.replaceOrAddString("anotherValue", forKey: "testKey2")
  66. XCTAssertEqual(metadata.count, 3)
  67. sequence = metadata[stringValues: "testKey"]
  68. iterator = sequence.makeIterator()
  69. XCTAssertEqual(iterator.next(), "value1")
  70. XCTAssertEqual(iterator.next(), "value2")
  71. XCTAssertNil(iterator.next())
  72. sequence = metadata[stringValues: "testKey2"]
  73. iterator = sequence.makeIterator()
  74. XCTAssertEqual(iterator.next(), "anotherValue")
  75. XCTAssertNil(iterator.next())
  76. metadata.replaceOrAddString("newValue", forKey: "testKey")
  77. XCTAssertEqual(metadata.count, 2)
  78. sequence = metadata[stringValues: "testKey"]
  79. iterator = sequence.makeIterator()
  80. XCTAssertEqual(iterator.next(), "newValue")
  81. XCTAssertNil(iterator.next())
  82. sequence = metadata[stringValues: "testKey2"]
  83. iterator = sequence.makeIterator()
  84. XCTAssertEqual(iterator.next(), "anotherValue")
  85. XCTAssertNil(iterator.next())
  86. }
  87. func testReserveCapacity() {
  88. var metadata = Metadata()
  89. XCTAssertEqual(metadata.capacity, 0)
  90. metadata.reserveCapacity(10)
  91. XCTAssertEqual(metadata.capacity, 10)
  92. }
  93. func testValuesIteration() {
  94. let metadata: Metadata = [
  95. "testKey-bin": "string1",
  96. "testKey-bin": .binary(.init("data1".utf8)),
  97. "testKey-bin": "string2",
  98. "testKey-bin": .binary(.init("data2".utf8)),
  99. "testKey-bin": "string3",
  100. "testKey-bin": .binary(.init("data3".utf8)),
  101. ]
  102. XCTAssertEqual(metadata.count, 6)
  103. let sequence = metadata["testKey-bin"]
  104. var iterator = sequence.makeIterator()
  105. XCTAssertEqual(iterator.next(), .string("string1"))
  106. XCTAssertEqual(iterator.next(), .binary(.init("data1".utf8)))
  107. XCTAssertEqual(iterator.next(), .string("string2"))
  108. XCTAssertEqual(iterator.next(), .binary(.init("data2".utf8)))
  109. XCTAssertEqual(iterator.next(), .string("string3"))
  110. XCTAssertEqual(iterator.next(), .binary(.init("data3".utf8)))
  111. XCTAssertNil(iterator.next())
  112. }
  113. func testStringValuesIteration() {
  114. let metadata: Metadata = [
  115. "testKey-bin": "string1",
  116. "testKey-bin": .binary(.init("data1".utf8)),
  117. "testKey-bin": "string2",
  118. "testKey-bin": .binary(.init("data2".utf8)),
  119. "testKey-bin": "string3",
  120. "testKey-bin": .binary(.init("data3".utf8)),
  121. ]
  122. XCTAssertEqual(metadata.count, 6)
  123. let stringSequence = metadata[stringValues: "testKey-bin"]
  124. var stringIterator = stringSequence.makeIterator()
  125. XCTAssertEqual(stringIterator.next(), "string1")
  126. XCTAssertEqual(stringIterator.next(), "string2")
  127. XCTAssertEqual(stringIterator.next(), "string3")
  128. XCTAssertNil(stringIterator.next())
  129. }
  130. func testBinaryValuesIteration_InvalidBase64EncodedStrings() {
  131. let metadata: Metadata = [
  132. "testKey-bin": "invalidBase64-1",
  133. "testKey-bin": .binary(.init("data1".utf8)),
  134. "testKey-bin": "invalidBase64-2",
  135. "testKey-bin": .binary(.init("data2".utf8)),
  136. "testKey-bin": "invalidBase64-3",
  137. "testKey-bin": .binary(.init("data3".utf8)),
  138. ]
  139. XCTAssertEqual(metadata.count, 6)
  140. let binarySequence = metadata[binaryValues: "testKey-bin"]
  141. var binaryIterator = binarySequence.makeIterator()
  142. XCTAssertEqual(binaryIterator.next(), Array("data1".utf8))
  143. XCTAssertEqual(binaryIterator.next(), Array("data2".utf8))
  144. XCTAssertEqual(binaryIterator.next(), Array("data3".utf8))
  145. XCTAssertNil(binaryIterator.next())
  146. }
  147. func testBinaryValuesIteration_ValidBase64EncodedStrings() {
  148. let metadata: Metadata = [
  149. "testKey-bin": "c3RyaW5nMQ==",
  150. "testKey-bin": .binary(.init("data1".utf8)),
  151. "testKey-bin": "c3RyaW5nMg==",
  152. "testKey-bin": .binary(.init("data2".utf8)),
  153. "testKey-bin": "c3RyaW5nMw==",
  154. "testKey-bin": .binary(.init("data3".utf8)),
  155. ]
  156. XCTAssertEqual(metadata.count, 6)
  157. let binarySequence = metadata[binaryValues: "testKey-bin"]
  158. var binaryIterator = binarySequence.makeIterator()
  159. XCTAssertEqual(binaryIterator.next(), Array("string1".utf8))
  160. XCTAssertEqual(binaryIterator.next(), Array("data1".utf8))
  161. XCTAssertEqual(binaryIterator.next(), Array("string2".utf8))
  162. XCTAssertEqual(binaryIterator.next(), Array("data2".utf8))
  163. XCTAssertEqual(binaryIterator.next(), Array("string3".utf8))
  164. XCTAssertEqual(binaryIterator.next(), Array("data3".utf8))
  165. XCTAssertNil(binaryIterator.next())
  166. }
  167. func testKeysAreCaseInsensitive() {
  168. let metadata: Metadata = [
  169. "testkey1": "value1",
  170. "TESTKEY2": "value2",
  171. ]
  172. XCTAssertEqual(metadata.count, 2)
  173. var stringSequence = metadata[stringValues: "TESTKEY1"]
  174. var stringIterator = stringSequence.makeIterator()
  175. XCTAssertEqual(stringIterator.next(), "value1")
  176. XCTAssertNil(stringIterator.next())
  177. stringSequence = metadata[stringValues: "testkey2"]
  178. stringIterator = stringSequence.makeIterator()
  179. XCTAssertEqual(stringIterator.next(), "value2")
  180. XCTAssertNil(stringIterator.next())
  181. }
  182. }