MetadataTests.swift 8.2 KB

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