Skip to content

Commit b6fda97

Browse files
SWIFT-1464 Test server selection read preference validation (#741)
1 parent 9ef3f70 commit b6fda97

File tree

2 files changed

+25
-2
lines changed

2 files changed

+25
-2
lines changed

Sources/MongoSwift/ServerSelection.swift

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ extension TopologyDescription {
107107
readPreference: ReadPreference,
108108
heartbeatFrequencyMS: Int
109109
) throws -> [ServerDescription] {
110-
try readPreference.validateMaxStalenessSeconds(
110+
try readPreference.validateForServerSelection(
111111
heartbeatFrequencyMS: heartbeatFrequencyMS,
112112
topologyType: self.type
113113
)
@@ -267,7 +267,7 @@ extension ServerDescription {
267267
}
268268

269269
extension ReadPreference {
270-
fileprivate func validateMaxStalenessSeconds(
270+
fileprivate func validateForServerSelection(
271271
heartbeatFrequencyMS: Int,
272272
topologyType: TopologyDescription.TopologyType
273273
) throws {
@@ -294,6 +294,11 @@ extension ReadPreference {
294294
}
295295
}
296296
}
297+
if let tagSets = self.tagSets, tagSets.contains(where: { !$0.isEmpty }) && self.mode == .primary {
298+
throw MongoError.InvalidArgumentError(
299+
message: "A non-empty tag set cannot be specified when the read preference mode is primary"
300+
)
301+
}
297302
}
298303
}
299304

Tests/MongoSwiftTests/ServerSelectionTests.swift

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,5 +209,23 @@ final class ServerSelectionTests: MongoSwiftTestCase {
209209
}
210210
}
211211
}
212+
213+
func testReadPreferenceValidation() throws {
214+
var readPreference = ReadPreference.primary
215+
readPreference.tagSets = [["tag": "set"]]
216+
let topology = TopologyDescription(type: .single, servers: [])
217+
expect(try topology.findSuitableServers(readPreference: readPreference, heartbeatFrequencyMS: 0))
218+
.to(throwError(errorType: MongoError.InvalidArgumentError.self))
219+
220+
readPreference.tagSets = [[:]]
221+
expect(try topology.findSuitableServers(readPreference: readPreference, heartbeatFrequencyMS: 0))
222+
.toNot(throwError())
223+
224+
readPreference.tagSets = nil
225+
expect(try topology.findSuitableServers(readPreference: readPreference, heartbeatFrequencyMS: 0))
226+
.toNot(throwError())
227+
}
228+
229+
// TODO: SWIFT-1496: Implement the remaining server selection tests
212230
}
213231
#endif

0 commit comments

Comments
 (0)