Files
RediStack/Tests/RediStackTests/RedisCommandEncoderTests.swift
T
Fabian Fett 018a9b9626 Add RedisCommandEncoder (#69)
We want to be able to efficiently encode Redis commands that are sent to a server. This patch adds a new `RedisCommandEncoder` that allows us to efficiently create Redis commands without needing to go through RESP representations, that may require us to create Arrays. Further it introduces a `RESP3BlobStringEncodable` that must be implement to send blob strings using `RedisCommandEncoder`. This patch also adds implementations for `String` and  `ByteBuffer` for the new `RESP3BlobStringEncodable` protocol.
2023-07-03 10:28:39 +02:00

80 lines
2.6 KiB
Swift

//===----------------------------------------------------------------------===//
//
// This source file is part of the RediStack open source project
//
// Copyright (c) 2023 RediStack project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of RediStack project authors
//
// SPDX-License-Identifier: Apache-2.0
//
//===----------------------------------------------------------------------===//
import NIOCore
@testable import RediStack
import XCTest
final class RedisCommandEncoderTests: XCTestCase {
var encoder: RedisCommandEncoder!
override func setUp() {
self.encoder = RedisCommandEncoder(buffer: ByteBuffer())
super.setUp()
}
func testSimple() {
self.encoder.encodeRESPArray("GET", "foo")
var buffer = self.encoder.buffer
var resp: RESPValue?
XCTAssertNoThrow(resp = try RESPTranslator().parseBytes(from: &buffer))
XCTAssertEqual(resp, .array([.bulkString(.init(string: "GET")), .bulkString(.init(string: "foo"))]))
}
func testStringAndByteBuffer() {
let twelves = ByteBuffer(repeating: UInt8(ascii: "a"), count: 8)
self.encoder.encodeRESPArray("SET", twelves)
var buffer = self.encoder.buffer
XCTAssert(buffer.readableBytesView.elementsEqual("*2\r\n$3\r\nSET\r\n$8\r\naaaaaaaa\r\n".utf8))
var resp: RESPValue?
XCTAssertNoThrow(resp = try RESPTranslator().parseBytes(from: &buffer))
XCTAssertEqual(resp, .array([.bulkString(.init(string: "SET")), .bulkString(twelves)]))
}
func testSingleElement() {
self.encoder.encodeRESPArray("FOO")
var buffer = self.encoder.buffer
XCTAssert(buffer.readableBytesView.elementsEqual("*1\r\n$3\r\nFOO\r\n".utf8))
var resp: RESPValue?
XCTAssertNoThrow(resp = try RESPTranslator().parseBytes(from: &buffer))
XCTAssertEqual(resp, .array([.bulkString(.init(string: "FOO"))]))
}
func testSevenElements() {
self.encoder.encodeRESPArray("SET", "key", "value", "NX", "GET", "EX", "60")
var buffer = self.encoder.buffer
var resp: RESPValue?
XCTAssertNoThrow(resp = try RESPTranslator().parseBytes(from: &buffer))
let expected = RESPValue.array([
.bulkString(.init(string: "SET")),
.bulkString(.init(string: "key")),
.bulkString(.init(string: "value")),
.bulkString(.init(string: "NX")),
.bulkString(.init(string: "GET")),
.bulkString(.init(string: "EX")),
.bulkString(.init(string: "60"))
])
XCTAssertEqual(resp, expected)
}
}