LengthPrefixedMessageWriterTests.swift 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. /*
  2. * Copyright 2020, 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. @testable import GRPC
  17. import NIOCore
  18. import XCTest
  19. class LengthPrefixedMessageWriterTests: GRPCTestCase {
  20. func testWriteBytesWithNoLeadingSpaceOrCompression() throws {
  21. var writer = LengthPrefixedMessageWriter()
  22. let allocator = ByteBufferAllocator()
  23. let buffer = allocator.buffer(bytes: [1, 2, 3])
  24. var (prefixed, other) = try writer.write(buffer: buffer)
  25. XCTAssertNil(other)
  26. XCTAssertEqual(prefixed.readInteger(as: UInt8.self), 0)
  27. XCTAssertEqual(prefixed.readInteger(as: UInt32.self), 3)
  28. XCTAssertEqual(prefixed.readBytes(length: 3), [1, 2, 3])
  29. XCTAssertEqual(prefixed.readableBytes, 0)
  30. }
  31. func testWriteBytesWithLeadingSpaceAndNoCompression() throws {
  32. var writer = LengthPrefixedMessageWriter()
  33. let allocator = ByteBufferAllocator()
  34. var buffer = allocator.buffer(bytes: Array(repeating: 0, count: 5) + [1, 2, 3])
  35. buffer.moveReaderIndex(forwardBy: 5)
  36. var (prefixed, other) = try writer.write(buffer: buffer)
  37. XCTAssertNil(other)
  38. XCTAssertEqual(prefixed.readInteger(as: UInt8.self), 0)
  39. XCTAssertEqual(prefixed.readInteger(as: UInt32.self), 3)
  40. XCTAssertEqual(prefixed.readBytes(length: 3), [1, 2, 3])
  41. XCTAssertEqual(prefixed.readableBytes, 0)
  42. }
  43. func testWriteBytesWithNoLeadingSpaceAndCompression() throws {
  44. var writer = LengthPrefixedMessageWriter(compression: .gzip)
  45. let allocator = ByteBufferAllocator()
  46. let buffer = allocator.buffer(bytes: [1, 2, 3])
  47. var (prefixed, other) = try writer.write(buffer: buffer)
  48. XCTAssertNil(other)
  49. XCTAssertEqual(prefixed.readInteger(as: UInt8.self), 1)
  50. let size = prefixed.readInteger(as: UInt32.self)!
  51. XCTAssertGreaterThanOrEqual(size, 0)
  52. XCTAssertNotNil(prefixed.readBytes(length: Int(size)))
  53. XCTAssertEqual(prefixed.readableBytes, 0)
  54. }
  55. func testWriteBytesWithLeadingSpaceAndCompression() throws {
  56. var writer = LengthPrefixedMessageWriter(compression: .gzip)
  57. let allocator = ByteBufferAllocator()
  58. var buffer = allocator.buffer(bytes: Array(repeating: 0, count: 5) + [1, 2, 3])
  59. buffer.moveReaderIndex(forwardBy: 5)
  60. var (prefixed, other) = try writer.write(buffer: buffer)
  61. XCTAssertNil(other)
  62. XCTAssertEqual(prefixed.readInteger(as: UInt8.self), 1)
  63. let size = prefixed.readInteger(as: UInt32.self)!
  64. XCTAssertGreaterThanOrEqual(size, 0)
  65. XCTAssertNotNil(prefixed.readBytes(length: Int(size)))
  66. XCTAssertEqual(prefixed.readableBytes, 0)
  67. }
  68. func testLargeCompressedPayloadEmitsOneBuffer() throws {
  69. var writer = LengthPrefixedMessageWriter(compression: .gzip)
  70. let allocator = ByteBufferAllocator()
  71. let message = ByteBuffer(repeating: 0, count: 16 * 1024 * 1024)
  72. var (lengthPrefixed, other) = try writer.write(buffer: message)
  73. XCTAssertNil(other)
  74. XCTAssertEqual(lengthPrefixed.readInteger(as: UInt8.self), 1)
  75. let length = lengthPrefixed.readInteger(as: UInt32.self)
  76. XCTAssertEqual(length, UInt32(lengthPrefixed.readableBytes))
  77. }
  78. func testLargeUncompressedPayloadEmitsTwoBuffers() throws {
  79. var writer = LengthPrefixedMessageWriter(compression: .none)
  80. let allocator = ByteBufferAllocator()
  81. let message = ByteBuffer(repeating: 0, count: 16 * 1024 * 1024)
  82. var (header, payload) = try writer.write(buffer: message)
  83. XCTAssertEqual(header.readInteger(as: UInt8.self), 0)
  84. XCTAssertEqual(header.readInteger(as: UInt32.self), UInt32(message.readableBytes))
  85. XCTAssertEqual(header.readableBytes, 0)
  86. XCTAssertEqual(payload, message)
  87. }
  88. }
  89. extension LengthPrefixedMessageWriter {
  90. init(compression: CompressionAlgorithm? = nil) {
  91. self.init(compression: compression, allocator: .init())
  92. }
  93. }