Skip to content

Commit f91acdc

Browse files
authored
Add first ValkeyConnection unit test (#17)
1 parent b6cb0ea commit f91acdc

File tree

3 files changed

+74
-10
lines changed

3 files changed

+74
-10
lines changed

Package.swift

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,17 @@ let package = Package(
3434
),
3535
.testTarget(
3636
name: "IntegrationTests",
37-
dependencies: ["Valkey"]
37+
dependencies: [
38+
"Valkey",
39+
]
3840
),
3941
.testTarget(
4042
name: "ValkeyTests",
4143
dependencies: [
4244
"Valkey",
4345
.product(name: "NIOTestUtils", package: "swift-nio"),
46+
.product(name: "Logging", package: "swift-log"),
47+
.product(name: "NIOEmbedded", package: "swift-nio"),
4448
]
4549
),
4650
]

Sources/Valkey/Connection/ValkeyConnection.swift

Lines changed: 31 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -191,15 +191,7 @@ public final class ValkeyConnection: Sendable {
191191

192192
let connect = bootstrap.channelInitializer { channel in
193193
do {
194-
let sync = channel.pipeline.syncOperations
195-
if case .enable(let sslContext, let tlsServerName) = configuration.tls.base {
196-
try sync.addHandler(NIOSSLClientHandler(context: sslContext, serverHostname: tlsServerName))
197-
}
198-
let valkeyChannelHandler = ValkeyChannelHandler(
199-
eventLoop: channel.eventLoop,
200-
logger: logger
201-
)
202-
try sync.addHandler(valkeyChannelHandler)
194+
try self._setupChannel(channel, configuration: configuration, logger: logger)
203195
return eventLoop.makeSucceededVoidFuture()
204196
} catch {
205197
return eventLoop.makeFailedFuture(error)
@@ -226,6 +218,36 @@ public final class ValkeyConnection: Sendable {
226218
}
227219
}
228220

221+
package static func setupChannel(_ channel: any Channel, configuration: ValkeyClientConfiguration, logger: Logger) async throws -> ValkeyConnection {
222+
if !channel.eventLoop.inEventLoop {
223+
return try await channel.eventLoop.submit {
224+
let handler = try self._setupChannel(channel, configuration: configuration, logger: logger)
225+
return ValkeyConnection(channel: channel, channelHandler: handler, configuration: configuration, logger: logger)
226+
}.get()
227+
}
228+
229+
let handler = try self._setupChannel(channel, configuration: configuration, logger: logger)
230+
return ValkeyConnection(channel: channel, channelHandler: handler, configuration: configuration, logger: logger)
231+
}
232+
233+
@discardableResult
234+
private static func _setupChannel(_ channel: any Channel, configuration: ValkeyClientConfiguration, logger: Logger) throws -> ValkeyChannelHandler {
235+
channel.eventLoop.assertInEventLoop()
236+
let sync = channel.pipeline.syncOperations
237+
switch configuration.tls.base {
238+
case .enable(let sslContext, let tlsServerName):
239+
try sync.addHandler(NIOSSLClientHandler(context: sslContext, serverHostname: tlsServerName))
240+
case .disable:
241+
break
242+
}
243+
let valkeyChannelHandler = ValkeyChannelHandler(
244+
eventLoop: channel.eventLoop,
245+
logger: logger
246+
)
247+
try sync.addHandler(valkeyChannelHandler)
248+
return valkeyChannelHandler
249+
}
250+
229251
/// create a BSD sockets based bootstrap
230252
private static func createSocketsBootstrap(eventLoopGroup: EventLoopGroup) -> ClientBootstrap {
231253
ClientBootstrap(group: eventLoopGroup)
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
//===----------------------------------------------------------------------===//
2+
//
3+
// This source file is part of the swift-valkey open source project
4+
//
5+
// Copyright (c) 2025 the swift-valkey project authors
6+
// Licensed under Apache License v2.0
7+
//
8+
// See LICENSE.txt for license information
9+
// See CONTRIBUTORS.txt for the list of swift-valkey project authors
10+
//
11+
// SPDX-License-Identifier: Apache-2.0
12+
//
13+
//===----------------------------------------------------------------------===//
14+
15+
import Logging
16+
import NIOCore
17+
import NIOEmbedded
18+
import Testing
19+
import Valkey
20+
21+
@Suite
22+
struct ConnectionTests {
23+
24+
@Test
25+
func testConnectionCreationAndGET() async throws {
26+
let channel = NIOAsyncTestingChannel()
27+
let logger = Logger(label: "test")
28+
let connection = try await ValkeyConnection.setupChannel(channel, configuration: .init(), logger: logger)
29+
30+
async let fooResult = connection.get(key: "foo")
31+
32+
let outbound = try await channel.waitForOutboundWrite(as: ByteBuffer.self)
33+
#expect(outbound == ByteBuffer(string: "*2\r\n$3\r\nGET\r\n$3\r\nfoo\r\n"))
34+
35+
try await channel.writeInbound(ByteBuffer(string: "$3\r\nBar\r\n"))
36+
#expect(try await fooResult == "Bar")
37+
}
38+
}

0 commit comments

Comments
 (0)