Skip to content

Commit 2387dc4

Browse files
authored
Improve tests, remove state shortcuts (#636)
1 parent a5c85d2 commit 2387dc4

File tree

9 files changed

+272
-182
lines changed

9 files changed

+272
-182
lines changed

Sources/PostgresNIO/New/Connection State Machine/ConnectionStateMachine.swift

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -161,14 +161,6 @@ struct ConnectionStateMachine {
161161
self.requireBackendKeyData = requireBackendKeyData
162162
}
163163

164-
#if DEBUG
165-
/// for testing purposes only
166-
init(_ state: State, requireBackendKeyData: Bool = true) {
167-
self.state = state
168-
self.requireBackendKeyData = requireBackendKeyData
169-
}
170-
#endif
171-
172164
enum TLSConfiguration {
173165
case disable
174166
case prefer

Sources/PostgresNIO/New/PostgresChannelHandler.swift

Lines changed: 1 addition & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -38,24 +38,6 @@ final class PostgresChannelHandler: ChannelDuplexHandler {
3838
self.logger = logger
3939
self.decoder = NIOSingleStepByteToMessageProcessor(PostgresBackendMessageDecoder())
4040
}
41-
42-
#if DEBUG
43-
/// for testing purposes only
44-
init(
45-
configuration: PostgresConnection.InternalConfiguration,
46-
eventLoop: any EventLoop,
47-
state: ConnectionStateMachine = .init(.initialized),
48-
logger: Logger = .psqlNoOpLogger,
49-
configureSSLCallback: ((any Channel, PostgresChannelHandler) throws -> Void)?
50-
) {
51-
self.state = state
52-
self.eventLoop = eventLoop
53-
self.configuration = configuration
54-
self.configureSSLCallback = configureSSLCallback
55-
self.logger = logger
56-
self.decoder = NIOSingleStepByteToMessageProcessor(PostgresBackendMessageDecoder())
57-
}
58-
#endif
5941

6042
// MARK: Handler lifecycle
6143

@@ -189,7 +171,7 @@ final class PostgresChannelHandler: ChannelDuplexHandler {
189171
promise.succeed()
190172
case .failPromise(let promise, error: let error):
191173
promise.fail(error)
192-
}
174+
}
193175
}
194176

195177
/// Cancel the currently executing operation, if it is cancellable.

Tests/PostgresNIOTests/New/Connection State Machine/ConnectionStateMachineTests.swift

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -59,9 +59,9 @@ import NIOSSL
5959
#expect(state.sslUnsupportedReceived() == .provideAuthenticationContext)
6060
}
6161

62-
@Test func testParameterStatusReceivedAndBackendKeyAfterAuthenticated() {
63-
var state = ConnectionStateMachine(.authenticated(nil, [:]))
64-
62+
@Test func testParameterStatusReceivedAndBackendKeyAfterAuthenticated() throws {
63+
var state = try ConnectionStateMachine.makeAuthenticatedIdle()
64+
6565
#expect(state.parameterStatusReceived(.init(parameter: "DateStyle", value: "ISO, MDY")) == .wait)
6666
#expect(state.parameterStatusReceived(.init(parameter: "application_name", value: "")) == .wait)
6767
#expect(state.parameterStatusReceived(.init(parameter: "server_encoding", value: "UTF8")) == .wait)
@@ -78,9 +78,9 @@ import NIOSSL
7878
#expect(state.readyForQueryReceived(.idle) == .fireEventReadyForQuery)
7979
}
8080

81-
@Test func testBackendKeyAndParameterStatusReceivedAfterAuthenticated() {
82-
var state = ConnectionStateMachine(.authenticated(nil, [:]))
83-
81+
@Test func testBackendKeyAndParameterStatusReceivedAfterAuthenticated() throws {
82+
var state = try ConnectionStateMachine.makeAuthenticatedIdle()
83+
8484
#expect(state.backendKeyDataReceived(.init(processID: 2730, secretKey: 882037977)) == .wait)
8585

8686
#expect(state.parameterStatusReceived(.init(parameter: "DateStyle", value: "ISO, MDY")) == .wait)
@@ -98,9 +98,9 @@ import NIOSSL
9898
#expect(state.readyForQueryReceived(.idle) == .fireEventReadyForQuery)
9999
}
100100

101-
@Test func testReadyForQueryReceivedWithoutBackendKeyAfterAuthenticated() {
102-
var state = ConnectionStateMachine(.authenticated(nil, [:]), requireBackendKeyData: true)
103-
101+
@Test func testReadyForQueryReceivedWithoutBackendKeyAfterAuthenticated() throws {
102+
var state = try ConnectionStateMachine.makeAuthenticatedIdle()
103+
104104
#expect(state.parameterStatusReceived(.init(parameter: "DateStyle", value: "ISO, MDY")) == .wait)
105105
#expect(state.parameterStatusReceived(.init(parameter: "application_name", value: "")) == .wait)
106106
#expect(state.parameterStatusReceived(.init(parameter: "server_encoding", value: "UTF8")) == .wait)
@@ -117,9 +117,9 @@ import NIOSSL
117117
.closeConnectionAndCleanup(.init(action: .close, tasks: [], error: PSQLError.unexpectedBackendMessage(.readyForQuery(.idle)), closePromise: nil)))
118118
}
119119

120-
@Test func testReadyForQueryReceivedWithoutUnneededBackendKeyAfterAuthenticated() {
121-
var state = ConnectionStateMachine(.authenticated(nil, [:]), requireBackendKeyData: false)
122-
120+
@Test func testReadyForQueryReceivedWithoutUnneededBackendKeyAfterAuthenticated() throws {
121+
var state = try ConnectionStateMachine.makeAuthenticatedIdle(requireBackendKeyData: false)
122+
123123
#expect(state.parameterStatusReceived(.init(parameter: "DateStyle", value: "ISO, MDY")) == .wait)
124124
#expect(state.parameterStatusReceived(.init(parameter: "application_name", value: "")) == .wait)
125125
#expect(state.parameterStatusReceived(.init(parameter: "server_encoding", value: "UTF8")) == .wait)
@@ -135,16 +135,18 @@ import NIOSSL
135135
#expect(state.readyForQueryReceived(.idle) == .fireEventReadyForQuery)
136136
}
137137

138-
@Test func testErrorIsIgnoredWhenClosingConnection() {
138+
@Test func testErrorIsIgnoredWhenClosingConnection() throws {
139139
// test ignore unclean shutdown when closing connection
140-
var stateIgnoreChannelError = ConnectionStateMachine(.closing(nil))
140+
var stateIgnoreChannelError = try ConnectionStateMachine.makeReadyForQuery()
141+
#expect(.closeConnection(nil) == stateIgnoreChannelError.gracefulClose(nil))
141142

142143
#expect(stateIgnoreChannelError.errorHappened(.connectionError(underlying: NIOSSLError.uncleanShutdown)) == .wait)
143144
#expect(stateIgnoreChannelError.closed() == .fireChannelInactive)
144145

145146
// test ignore any other error when closing connection
146147

147-
var stateIgnoreErrorMessage = ConnectionStateMachine(.closing(nil))
148+
var stateIgnoreErrorMessage = try ConnectionStateMachine.makeReadyForQuery()
149+
#expect(.closeConnection(nil) == stateIgnoreErrorMessage.gracefulClose(nil))
148150
#expect(stateIgnoreErrorMessage.errorReceived(.init(fields: [:])) == .wait)
149151
#expect(stateIgnoreErrorMessage.closed() == .fireChannelInactive)
150152
}

Tests/PostgresNIOTests/New/Connection State Machine/ExtendedQueryStateMachineTests.swift

Lines changed: 21 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,9 @@ import Logging
55
@testable import PostgresNIO
66

77
@Suite struct ExtendedQueryStateMachineTests {
8-
9-
@Test func testExtendedQueryWithoutDataRowsHappyPath() {
10-
var state = ConnectionStateMachine.readyForQuery()
11-
8+
@Test func testExtendedQueryWithoutDataRowsHappyPath() throws {
9+
var state = try ConnectionStateMachine.makeReadyForQuery()
10+
1211
let logger = Logger.psqlTest
1312
let promise = EmbeddedEventLoop().makePromise(of: PSQLRowStream.self)
1413
promise.fail(PSQLError.uncleanShutdown) // we don't care about the error at all.
@@ -24,9 +23,9 @@ import Logging
2423
#expect(state.readyForQueryReceived(.idle) == .fireEventReadyForQuery)
2524
}
2625

27-
@Test func testExtendedQueryWithDataRowsHappyPath() {
28-
var state = ConnectionStateMachine.readyForQuery()
29-
26+
@Test func testExtendedQueryWithDataRowsHappyPath() throws {
27+
var state = try ConnectionStateMachine.makeReadyForQuery()
28+
3029
let logger = Logger.psqlTest
3130
let promise = EmbeddedEventLoop().makePromise(of: PSQLRowStream.self)
3231
promise.fail(PSQLError.uncleanShutdown) // we don't care about the error at all.
@@ -78,8 +77,8 @@ import Logging
7877
#expect(state.readyForQueryReceived(.idle) == .fireEventReadyForQuery)
7978
}
8079

81-
@Test func testExtendedQueryWithNoQuery() {
82-
var state = ConnectionStateMachine.readyForQuery()
80+
@Test func testExtendedQueryWithNoQuery() throws {
81+
var state = try ConnectionStateMachine.makeReadyForQuery()
8382

8483
let logger = Logger.psqlTest
8584
let promise = EmbeddedEventLoop().makePromise(of: PSQLRowStream.self)
@@ -96,9 +95,9 @@ import Logging
9695
#expect(state.readyForQueryReceived(.idle) == .fireEventReadyForQuery)
9796
}
9897

99-
@Test func testReceiveTotallyUnexpectedMessageInQuery() {
100-
var state = ConnectionStateMachine.readyForQuery()
101-
98+
@Test func testReceiveTotallyUnexpectedMessageInQuery() throws {
99+
var state = try ConnectionStateMachine.makeReadyForQuery()
100+
102101
let logger = Logger.psqlTest
103102
let promise = EmbeddedEventLoop().makePromise(of: PSQLRowStream.self)
104103
promise.fail(PSQLError.uncleanShutdown) // we don't care about the error at all.
@@ -114,8 +113,8 @@ import Logging
114113
.failQuery(promise, with: psqlError, cleanupContext: .init(action: .close, tasks: [], error: psqlError, closePromise: nil)))
115114
}
116115

117-
@Test func testExtendedQueryIsCancelledImmediately() {
118-
var state = ConnectionStateMachine.readyForQuery()
116+
@Test func testExtendedQueryIsCancelledImmediately() throws {
117+
var state = try ConnectionStateMachine.makeReadyForQuery()
119118

120119
let logger = Logger.psqlTest
121120
let promise = EmbeddedEventLoop().makePromise(of: PSQLRowStream.self)
@@ -158,8 +157,8 @@ import Logging
158157
#expect(state.readyForQueryReceived(.idle) == .fireEventReadyForQuery)
159158
}
160159

161-
@Test func testExtendedQueryIsCancelledWithReadPending() {
162-
var state = ConnectionStateMachine.readyForQuery()
160+
@Test func testExtendedQueryIsCancelledWithReadPending() throws {
161+
var state = try ConnectionStateMachine.makeReadyForQuery()
163162

164163
let logger = Logger.psqlTest
165164
let promise = EmbeddedEventLoop().makePromise(of: PSQLRowStream.self)
@@ -200,8 +199,8 @@ import Logging
200199
#expect(state.readyForQueryReceived(.idle) == .fireEventReadyForQuery)
201200
}
202201

203-
@Test func testCancelQueryAfterServerError() {
204-
var state = ConnectionStateMachine.readyForQuery()
202+
@Test func testCancelQueryAfterServerError() throws {
203+
var state = try ConnectionStateMachine.makeReadyForQuery()
205204

206205
let logger = Logger.psqlTest
207206
let promise = EmbeddedEventLoop().makePromise(of: PSQLRowStream.self)
@@ -254,8 +253,8 @@ import Logging
254253
#expect(state.readyForQueryReceived(.idle) == .fireEventReadyForQuery)
255254
}
256255

257-
@Test func testQueryErrorDoesNotKillConnection() {
258-
var state = ConnectionStateMachine.readyForQuery()
256+
@Test func testQueryErrorDoesNotKillConnection() throws {
257+
var state = try ConnectionStateMachine.makeReadyForQuery()
259258

260259
let logger = Logger.psqlTest
261260
let promise = EmbeddedEventLoop().makePromise(of: PSQLRowStream.self)
@@ -275,8 +274,8 @@ import Logging
275274
#expect(state.readyForQueryReceived(.idle) == .fireEventReadyForQuery)
276275
}
277276

278-
@Test func testQueryErrorAfterCancelDoesNotKillConnection() {
279-
var state = ConnectionStateMachine.readyForQuery()
277+
@Test func testQueryErrorAfterCancelDoesNotKillConnection() throws {
278+
var state = try ConnectionStateMachine.makeReadyForQuery()
280279

281280
let logger = Logger.psqlTest
282281
let promise = EmbeddedEventLoop().makePromise(of: PSQLRowStream.self)
@@ -294,5 +293,4 @@ import Logging
294293

295294
#expect(state.readyForQueryReceived(.idle) == .fireEventReadyForQuery)
296295
}
297-
298296
}
Lines changed: 28 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
import XCTest
1+
import Testing
22
import NIOEmbedded
33
@testable import PostgresNIO
44

5-
class PrepareStatementStateMachineTests: XCTestCase {
6-
func testCreatePreparedStatementReturningRowDescription() {
7-
var state = ConnectionStateMachine.readyForQuery()
8-
5+
@Suite struct PrepareStatementStateMachineTests {
6+
@Test func testCreatePreparedStatementReturningRowDescription() throws {
7+
var state = try ConnectionStateMachine.makeReadyForQuery()
8+
99
let promise = EmbeddedEventLoop().makePromise(of: RowDescription?.self)
1010
promise.fail(PSQLError.uncleanShutdown) // we don't care about the error at all.
1111

@@ -15,23 +15,23 @@ class PrepareStatementStateMachineTests: XCTestCase {
1515
name: name, query: query, bindingDataTypes: [], logger: .psqlTest, promise: promise
1616
)
1717

18-
XCTAssertEqual(state.enqueue(task: .extendedQuery(prepareStatementContext)),
18+
#expect(state.enqueue(task: .extendedQuery(prepareStatementContext)) ==
1919
.sendParseDescribeSync(name: name, query: query, bindingDataTypes: []))
20-
XCTAssertEqual(state.parseCompleteReceived(), .wait)
21-
XCTAssertEqual(state.parameterDescriptionReceived(.init(dataTypes: [.int8])), .wait)
22-
20+
#expect(state.parseCompleteReceived() == .wait)
21+
#expect(state.parameterDescriptionReceived(.init(dataTypes: [.int8])) == .wait)
22+
2323
let columns: [RowDescription.Column] = [
2424
.init(name: "id", tableOID: 0, columnAttributeNumber: 0, dataType: .int8, dataTypeSize: 8, dataTypeModifier: -1, format: .binary)
2525
]
2626

27-
XCTAssertEqual(state.rowDescriptionReceived(.init(columns: columns)),
27+
#expect(state.rowDescriptionReceived(.init(columns: columns)) ==
2828
.succeedPreparedStatementCreation(promise, with: .init(columns: columns)))
29-
XCTAssertEqual(state.readyForQueryReceived(.idle), .fireEventReadyForQuery)
29+
#expect(state.readyForQueryReceived(.idle) == .fireEventReadyForQuery)
3030
}
3131

32-
func testCreatePreparedStatementReturningNoData() {
33-
var state = ConnectionStateMachine.readyForQuery()
34-
32+
@Test func testCreatePreparedStatementReturningNoData() throws {
33+
var state = try ConnectionStateMachine.makeReadyForQuery()
34+
3535
let promise = EmbeddedEventLoop().makePromise(of: RowDescription?.self)
3636
promise.fail(PSQLError.uncleanShutdown) // we don't care about the error at all.
3737

@@ -41,18 +41,18 @@ class PrepareStatementStateMachineTests: XCTestCase {
4141
name: name, query: query, bindingDataTypes: [], logger: .psqlTest, promise: promise
4242
)
4343

44-
XCTAssertEqual(state.enqueue(task: .extendedQuery(prepareStatementContext)),
44+
#expect(state.enqueue(task: .extendedQuery(prepareStatementContext)) ==
4545
.sendParseDescribeSync(name: name, query: query, bindingDataTypes: []))
46-
XCTAssertEqual(state.parseCompleteReceived(), .wait)
47-
XCTAssertEqual(state.parameterDescriptionReceived(.init(dataTypes: [.int8])), .wait)
48-
49-
XCTAssertEqual(state.noDataReceived(),
46+
#expect(state.parseCompleteReceived() == .wait)
47+
#expect(state.parameterDescriptionReceived(.init(dataTypes: [.int8])) == .wait)
48+
49+
#expect(state.noDataReceived() ==
5050
.succeedPreparedStatementCreation(promise, with: nil))
51-
XCTAssertEqual(state.readyForQueryReceived(.idle), .fireEventReadyForQuery)
51+
#expect(state.readyForQueryReceived(.idle) == .fireEventReadyForQuery)
5252
}
5353

54-
func testErrorReceivedAfter() {
55-
var state = ConnectionStateMachine.readyForQuery()
54+
@Test func testErrorReceivedAfter() throws {
55+
var state = try ConnectionStateMachine.makeReadyForQuery()
5656

5757
let promise = EmbeddedEventLoop().makePromise(of: RowDescription?.self)
5858
promise.fail(PSQLError.uncleanShutdown) // we don't care about the error at all.
@@ -63,16 +63,16 @@ class PrepareStatementStateMachineTests: XCTestCase {
6363
name: name, query: query, bindingDataTypes: [], logger: .psqlTest, promise: promise
6464
)
6565

66-
XCTAssertEqual(state.enqueue(task: .extendedQuery(prepareStatementContext)),
66+
#expect(state.enqueue(task: .extendedQuery(prepareStatementContext)) ==
6767
.sendParseDescribeSync(name: name, query: query, bindingDataTypes: []))
68-
XCTAssertEqual(state.parseCompleteReceived(), .wait)
69-
XCTAssertEqual(state.parameterDescriptionReceived(.init(dataTypes: [.int8])), .wait)
68+
#expect(state.parseCompleteReceived() == .wait)
69+
#expect(state.parameterDescriptionReceived(.init(dataTypes: [.int8])) == .wait)
7070

71-
XCTAssertEqual(state.noDataReceived(),
71+
#expect(state.noDataReceived() ==
7272
.succeedPreparedStatementCreation(promise, with: nil))
73-
XCTAssertEqual(state.readyForQueryReceived(.idle), .fireEventReadyForQuery)
73+
#expect(state.readyForQueryReceived(.idle) == .fireEventReadyForQuery)
7474

75-
XCTAssertEqual(state.authenticationMessageReceived(.ok),
75+
#expect(state.authenticationMessageReceived(.ok) ==
7676
.closeConnectionAndCleanup(.init(action: .close, tasks: [], error: .unexpectedBackendMessage(.authentication(.ok)), closePromise: nil)))
7777
}
7878
}

0 commit comments

Comments
 (0)