diff --git a/.evergreen/config.yml b/.evergreen/config.yml index fcd294ccf..5c07bc3c5 100644 --- a/.evergreen/config.yml +++ b/.evergreen/config.yml @@ -356,6 +356,40 @@ functions: LINUX_SOURCEKIT_LIB_PATH=${PROJECT_DIRECTORY}/opt/swiftenv/versions/${SWIFT_VERSION}/usr/lib \ ${PROJECT_DIRECTORY}/opt/swiftlint/.build/release/swiftlint --strict --quiet + start-load-balancer: + - command: shell.exec + params: + script: | + DRIVERS_TOOLS=${DRIVERS_TOOLS} MONGODB_URI=${MONGODB_URI} \ + bash ${DRIVERS_TOOLS}/.evergreen/run-load-balancer.sh start + - command: expansions.update + params: + file: lb-expansion.yml + + stop-load-balancer: + - command: shell.exec + params: + script: | + DRIVERS_TOOLS=${DRIVERS_TOOLS} MONGODB_URI=${MONGODB_URI} \ + bash ${DRIVERS_TOOLS}/.evergreen/run-load-balancer.sh stop + + run-lb-tests: + - command: shell.exec + type: test + params: + working_dir: src + script: | + ${PREPARE_SHELL} + MONGODB_URI="${MONGODB_URI}" \ + TOPOLOGY="${TOPOLOGY}" \ + SSL=${SSL} \ + AUTH=${AUTH} \ + SWIFT_VERSION=${SWIFT_VERSION} \ + MONGODB_API_VERSION="${MONGODB_API_VERSION}" \ + SINGLE_MONGOS_LB_URI="${SINGLE_MONGOS_LB_URI}" \ + MULTI_MONGOS_LB_URI="${MULTI_MONGOS_LB_URI}" \ + ${PROJECT_DIRECTORY}/.evergreen/run-tests.sh + "sourcery": - command: shell.exec type: test @@ -579,6 +613,21 @@ tasks: MONGODB_VERSION: "latest" TOPOLOGY: "sharded_cluster" - func: "run tests" + + - name: "test-latest-load_balancer" + tags: ["latest", "load-balancer"] + commands: + - func: "prepare resources" + - func: "fix absolute paths" + - func: "bootstrap mongo-orchestration" + vars: + MONGODB_VERSION: "latest" + TOPOLOGY: "sharded_cluster" + - func: start-load-balancer + - func: "run-lb-tests" + vars: + TOPOLOGY: "load_balanced" + - func: stop-load-balancer - name: "test-atlas-connectivity" tags: ["atlas-connect"] @@ -1136,7 +1185,7 @@ buildvariants: ssl-auth: "*" display_name: "${swift-version} ${os-fully-featured} ${ssl-auth}" tasks: - - ".latest" + - ".latest !.load-balancer" - ".5.0" - ".4.4" - ".4.2" @@ -1165,7 +1214,7 @@ buildvariants: ssl-auth: "*" display_name: "${swift-version} ${os-fully-featured} ${ssl-auth}" tasks: - - ".latest" + - ".latest !.load-balancer" - ".5.0" - ".4.4" - ".4.2" @@ -1220,6 +1269,21 @@ buildvariants: tasks: - ".atlas-connect" +- matrix_name: "load-balancer-all" + matrix_spec: + os-fully-featured: + - "ubuntu-18.04" + - "ubuntu-20.04" + ssl-auth: "*" + swift-version: + - "5.2" + - "5.3" + - "5.4" + - "5.5-dev" + display_name: "Load Balancer ${swift-version} ${os-fully-featured} ${ssl-auth}" + tasks: + - ".load-balancer" + - matrix_name: "serverless" matrix_spec: os-fully-featured: diff --git a/.evergreen/run-tests.sh b/.evergreen/run-tests.sh index eab01d39f..08de363f3 100755 --- a/.evergreen/run-tests.sh +++ b/.evergreen/run-tests.sh @@ -5,6 +5,8 @@ set -o errexit # Exit the script with error if any of the commands fail # variables PROJECT_DIRECTORY=${PROJECT_DIRECTORY:-$PWD} MONGODB_URI=${MONGODB_URI:-"NO_URI_PROVIDED"} +SINGLE_MONGOS_LB_URI=${SINGLE_MONGOS_LB_URI:-"NO_URI_PROVIDED"} +MULTI_MONGOS_LB_URI=${MULTI_MONGOS_LB_URI:-"NO_URI_PROVIDED"} SWIFT_VERSION=${SWIFT_VERSION:-5.2.5} INSTALL_DIR="${PROJECT_DIRECTORY}/opt" TOPOLOGY=${TOPOLOGY:-single} @@ -58,7 +60,9 @@ if [ "$TEST_FILTER" != "NO_FILTER" ]; then FILTER_STATEMENT="--filter ${TEST_FILTER}" fi -MONGODB_TOPOLOGY=${TOPOLOGY} MONGODB_URI=$MONGODB_URI MONGODB_API_VERSION=$MONGODB_API_VERSION swift test $FILTER_STATEMENT 2>&1 | tee ${RAW_TEST_RESULTS} +MONGODB_TOPOLOGY=${TOPOLOGY} MONGODB_URI=$MONGODB_URI SINGLE_MONGOS_LB_URI=$SINGLE_MONGOS_LB_URI \ +MULTI_MONGOS_LB_URI=$MULTI_MONGOS_LB_URI MONGODB_API_VERSION=$MONGODB_API_VERSION \ +swift test $FILTER_STATEMENT 2>&1 | tee ${RAW_TEST_RESULTS} # save tests exit code EXIT_CODE=$? diff --git a/Sources/TestsCommon/CommonTestUtils.swift b/Sources/TestsCommon/CommonTestUtils.swift index 5e63477a7..1277b5e47 100644 --- a/Sources/TestsCommon/CommonTestUtils.swift +++ b/Sources/TestsCommon/CommonTestUtils.swift @@ -132,7 +132,7 @@ open class MongoSwiftTestCase: XCTestCase { } public static var multipleMongosLoadBalancedURI: String? { - ProcessInfo.processInfo.environment["MULTIPLE_MONGOS_LB_URI"] + ProcessInfo.processInfo.environment["MULTI_MONGOS_LB_URI"] } /// Indicates that we are running the tests with SSL enabled, determined by the environment variable $SSL. @@ -297,6 +297,15 @@ public struct TestRequirement: Decodable { ) ] + public static let changeStreamOnCollectionSupport = TestRequirement( + acceptableTopologies: [.replicaSet, .sharded, .shardedReplicaSet, .loadBalanced] + ) + + public static let changeStreamOnDBOrClientSupport = TestRequirement( + minServerVersion: ServerVersion(major: 4, minor: 0, patch: 0), + acceptableTopologies: [.replicaSet, .sharded, .shardedReplicaSet, .loadBalanced] + ) + public init( minServerVersion: ServerVersion? = nil, maxServerVersion: ServerVersion? = nil, diff --git a/Tests/MongoSwiftSyncTests/SyncChangeStreamTests.swift b/Tests/MongoSwiftSyncTests/SyncChangeStreamTests.swift index 8b1e7436e..9ddfbf674 100644 --- a/Tests/MongoSwiftSyncTests/SyncChangeStreamTests.swift +++ b/Tests/MongoSwiftSyncTests/SyncChangeStreamTests.swift @@ -358,10 +358,7 @@ final class SyncChangeStreamTests: MongoSwiftTestCase { /// Prose test 1 of change stream spec. /// "ChangeStream must continuously track the last seen resumeToken" func testChangeStreamTracksResumeToken() throws { - let testRequirements = TestRequirement( - acceptableTopologies: [.replicaSet, .sharded] - ) - let unmetRequirement = try MongoClient.makeTestClient().getUnmetRequirement(testRequirements) + let unmetRequirement = try MongoClient.makeTestClient().getUnmetRequirement(.changeStreamOnCollectionSupport) guard unmetRequirement == nil else { printSkipMessage(testName: self.name, unmetRequirement: unmetRequirement!) return @@ -396,11 +393,7 @@ final class SyncChangeStreamTests: MongoSwiftTestCase { * is < 8, this is a driver-side error; for 8+, this is a server-side error). */ func testChangeStreamMissingId() throws { - let testRequirements = TestRequirement( - acceptableTopologies: [.replicaSet, .sharded, .shardedReplicaSet] - ) - - let unmetRequirement = try MongoClient.makeTestClient().getUnmetRequirement(testRequirements) + let unmetRequirement = try MongoClient.makeTestClient().getUnmetRequirement(.changeStreamOnCollectionSupport) guard unmetRequirement == nil else { printSkipMessage(testName: self.name, unmetRequirement: unmetRequirement!) return @@ -436,7 +429,7 @@ final class SyncChangeStreamTests: MongoSwiftTestCase { let testRequirements = TestRequirement( // TODO: SWIFT-1257: remove server version requirement maxServerVersion: ServerVersion(major: 4, minor: 9, patch: 0), - acceptableTopologies: [.replicaSet, .sharded] + acceptableTopologies: [.replicaSet, .sharded, .shardedReplicaSet, .loadBalanced] ) let unmetRequirement = try MongoClient.makeTestClient().getUnmetRequirement(testRequirements) @@ -506,11 +499,7 @@ final class SyncChangeStreamTests: MongoSwiftTestCase { * ChangeStream will not attempt to resume on any error encountered while executing an aggregate command. */ func testChangeStreamFailedAggregate() throws { - let testRequirements = TestRequirement( - acceptableTopologies: [.replicaSet, .sharded] - ) - - let unmetRequirement = try MongoClient.makeTestClient().getUnmetRequirement(testRequirements) + let unmetRequirement = try MongoClient.makeTestClient().getUnmetRequirement(.changeStreamOnCollectionSupport) guard unmetRequirement == nil else { printSkipMessage(testName: self.name, unmetRequirement: unmetRequirement!) return @@ -562,11 +551,7 @@ final class SyncChangeStreamTests: MongoSwiftTestCase { * closed on the driver side. */ func testChangeStreamDoesntCloseOnEmptyBatch() throws { - let testRequirements = TestRequirement( - acceptableTopologies: [.replicaSet, .sharded] - ) - - let unmetRequirement = try MongoClient.makeTestClient().getUnmetRequirement(testRequirements) + let unmetRequirement = try MongoClient.makeTestClient().getUnmetRequirement(.changeStreamOnCollectionSupport) guard unmetRequirement == nil else { printSkipMessage(testName: self.name, unmetRequirement: unmetRequirement!) return @@ -594,11 +579,7 @@ final class SyncChangeStreamTests: MongoSwiftTestCase { * part of our evergreen matrix. */ func testChangeStreamFailedKillCursors() throws { - let testRequirements = TestRequirement( - acceptableTopologies: [.replicaSet, .sharded] - ) - - let unmetRequirement = try MongoClient.makeTestClient().getUnmetRequirement(testRequirements) + let unmetRequirement = try MongoClient.makeTestClient().getUnmetRequirement(.changeStreamOnCollectionSupport) guard unmetRequirement == nil else { printSkipMessage(testName: self.name, unmetRequirement: unmetRequirement!) return @@ -655,11 +636,7 @@ final class SyncChangeStreamTests: MongoSwiftTestCase { * - If resumeAfter was not specified, the getResumeToken result must be empty. */ func testChangeStreamResumeTokenUpdatesEmptyBatch() throws { - let testRequirements = TestRequirement( - acceptableTopologies: [.replicaSet, .sharded] - ) - - let unmetRequirement = try MongoClient.makeTestClient().getUnmetRequirement(testRequirements) + let unmetRequirement = try MongoClient.makeTestClient().getUnmetRequirement(.changeStreamOnCollectionSupport) guard unmetRequirement == nil else { printSkipMessage(testName: self.name, unmetRequirement: unmetRequirement!) return @@ -700,11 +677,7 @@ final class SyncChangeStreamTests: MongoSwiftTestCase { * - getResumeToken must return the _id of the previous document returned. */ func testChangeStreamResumeTokenUpdatesNonemptyBatch() throws { - let testRequirements = TestRequirement( - acceptableTopologies: [.replicaSet, .sharded] - ) - - let unmetRequirement = try MongoClient.makeTestClient().getUnmetRequirement(testRequirements) + let unmetRequirement = try MongoClient.makeTestClient().getUnmetRequirement(.changeStreamOnCollectionSupport) guard unmetRequirement == nil else { printSkipMessage(testName: self.name, unmetRequirement: unmetRequirement!) return @@ -735,7 +708,7 @@ final class SyncChangeStreamTests: MongoSwiftTestCase { let client = try MongoClient.makeTestClient() let testRequirements = TestRequirement( minServerVersion: ServerVersion(major: 4, minor: 0), - acceptableTopologies: [.replicaSet, .sharded] + acceptableTopologies: [.replicaSet, .sharded, .shardedReplicaSet, .loadBalanced] ) let unmetRequirement = try client.getUnmetRequirement(testRequirements) @@ -791,7 +764,7 @@ final class SyncChangeStreamTests: MongoSwiftTestCase { let client = try MongoClient.makeTestClient() let testRequirements = TestRequirement( minServerVersion: ServerVersion(major: 4, minor: 0), - acceptableTopologies: [.replicaSet, .sharded] + acceptableTopologies: [.replicaSet, .sharded, .shardedReplicaSet, .loadBalanced] ) let unmetRequirement = try client.getUnmetRequirement(testRequirements) @@ -832,11 +805,7 @@ final class SyncChangeStreamTests: MongoSwiftTestCase { func testChangeStreamOnACollection() throws { let client = try MongoClient.makeTestClient() - let testRequirements = TestRequirement( - acceptableTopologies: [.replicaSet, .sharded] - ) - - let unmetRequirement = try client.getUnmetRequirement(testRequirements) + let unmetRequirement = try client.getUnmetRequirement(.changeStreamOnCollectionSupport) guard unmetRequirement == nil else { printSkipMessage(testName: self.name, unmetRequirement: unmetRequirement!) return @@ -882,11 +851,7 @@ final class SyncChangeStreamTests: MongoSwiftTestCase { func testChangeStreamWithPipeline() throws { let client = try MongoClient.makeTestClient() - let testRequirements = TestRequirement( - acceptableTopologies: [.replicaSet, .sharded] - ) - - let unmetRequirement = try client.getUnmetRequirement(testRequirements) + let unmetRequirement = try client.getUnmetRequirement(.changeStreamOnCollectionSupport) guard unmetRequirement == nil else { printSkipMessage(testName: self.name, unmetRequirement: unmetRequirement!) return @@ -915,11 +880,7 @@ final class SyncChangeStreamTests: MongoSwiftTestCase { func testChangeStreamResumeToken() throws { let client = try MongoClient.makeTestClient() - let testRequirements = TestRequirement( - acceptableTopologies: [.replicaSet, .sharded] - ) - - let unmetRequirement = try client.getUnmetRequirement(testRequirements) + let unmetRequirement = try client.getUnmetRequirement(.changeStreamOnCollectionSupport) guard unmetRequirement == nil else { printSkipMessage(testName: self.name, unmetRequirement: unmetRequirement!) return @@ -994,11 +955,7 @@ final class SyncChangeStreamTests: MongoSwiftTestCase { func testChangeStreamWithEventType() throws { let client = try MongoClient.makeTestClient() - let testRequirements = TestRequirement( - acceptableTopologies: [.replicaSet, .sharded] - ) - - let unmetRequirement = try client.getUnmetRequirement(testRequirements) + let unmetRequirement = try client.getUnmetRequirement(.changeStreamOnCollectionSupport) guard unmetRequirement == nil else { printSkipMessage(testName: self.name, unmetRequirement: unmetRequirement!) return @@ -1046,11 +1003,7 @@ final class SyncChangeStreamTests: MongoSwiftTestCase { let expectedDoc1 = MyFullDocumentType(id: 1, x: 1, y: 2) let client = try MongoClient.makeTestClient() - let testRequirements = TestRequirement( - acceptableTopologies: [.replicaSet, .sharded] - ) - - let unmetRequirement = try client.getUnmetRequirement(testRequirements) + let unmetRequirement = try client.getUnmetRequirement(.changeStreamOnCollectionSupport) guard unmetRequirement == nil else { printSkipMessage(testName: self.name, unmetRequirement: unmetRequirement!) return @@ -1095,11 +1048,7 @@ final class SyncChangeStreamTests: MongoSwiftTestCase { func testChangeStreamOnACollectionWithCodableType() throws { let client = try MongoClient.makeTestClient() - let testRequirements = TestRequirement( - acceptableTopologies: [.replicaSet, .sharded] - ) - - let unmetRequirement = try client.getUnmetRequirement(testRequirements) + let unmetRequirement = try client.getUnmetRequirement(.changeStreamOnCollectionSupport) guard unmetRequirement == nil else { printSkipMessage(testName: self.name, unmetRequirement: unmetRequirement!) return @@ -1165,9 +1114,9 @@ final class SyncChangeStreamTests: MongoSwiftTestCase { func testDecodingInvalidateEventsOnCollection() throws { // invalidated change stream on a collection try self.withTestNamespace { client, _, collection in - let unmetRequirement = try MongoClient.makeTestClient().getUnmetRequirement( - TestRequirement(acceptableTopologies: [.replicaSet, .sharded]) - ) + let unmetRequirement = try MongoClient + .makeTestClient() + .getUnmetRequirement(.changeStreamOnCollectionSupport) guard unmetRequirement == nil else { printSkipMessage(testName: self.name, unmetRequirement: unmetRequirement!) return @@ -1202,12 +1151,7 @@ final class SyncChangeStreamTests: MongoSwiftTestCase { // invalidated change stream on a DB try self.withTestNamespace { client, db, collection in // DB change streams are supported as of 4.0 - let unmetRequirement = try client.getUnmetRequirement( - TestRequirement( - minServerVersion: ServerVersion(major: 4, minor: 0), - acceptableTopologies: [.replicaSet, .sharded] - ) - ) + let unmetRequirement = try client.getUnmetRequirement(.changeStreamOnDBOrClientSupport) guard unmetRequirement == nil else { printSkipMessage(testName: self.name, unmetRequirement: unmetRequirement!) return diff --git a/Tests/MongoSwiftTests/ChangeStreamTests.swift b/Tests/MongoSwiftTests/ChangeStreamTests.swift index 6004889a7..493411761 100644 --- a/Tests/MongoSwiftTests/ChangeStreamTests.swift +++ b/Tests/MongoSwiftTests/ChangeStreamTests.swift @@ -7,11 +7,7 @@ import TestsCommon final class ChangeStreamTests: MongoSwiftTestCase { func testChangeStreamNext() throws { try self.withTestClient { client in - let testRequirements = TestRequirement( - acceptableTopologies: [.replicaSet, .sharded] - ) - - let unmetRequirement = try client.getUnmetRequirement(testRequirements) + let unmetRequirement = try client.getUnmetRequirement(.changeStreamOnCollectionSupport) guard unmetRequirement == nil else { printSkipMessage(testName: self.name, unmetRequirement: unmetRequirement!) return @@ -48,10 +44,7 @@ final class ChangeStreamTests: MongoSwiftTestCase { func testChangeStreamError() throws { try self.withTestClient { client in - let testRequirements = TestRequirement( - acceptableTopologies: [.sharded, .replicaSet, .shardedReplicaSet] - ) - let unmetRequirement = try client.getUnmetRequirement(testRequirements) + let unmetRequirement = try client.getUnmetRequirement(.changeStreamOnCollectionSupport) guard unmetRequirement == nil else { printSkipMessage(testName: self.name, unmetRequirement: unmetRequirement!) return @@ -75,11 +68,7 @@ final class ChangeStreamTests: MongoSwiftTestCase { func testChangeStreamEmpty() throws { try self.withTestClient { client in - let testRequirements = TestRequirement( - acceptableTopologies: [.replicaSet, .sharded] - ) - - let unmetRequirement = try client.getUnmetRequirement(testRequirements) + let unmetRequirement = try client.getUnmetRequirement(.changeStreamOnCollectionSupport) guard unmetRequirement == nil else { printSkipMessage(testName: self.name, unmetRequirement: unmetRequirement!) return @@ -107,10 +96,7 @@ final class ChangeStreamTests: MongoSwiftTestCase { func testChangeStreamToArray() throws { try self.withTestClient { client in - let testRequirements = TestRequirement( - acceptableTopologies: [.replicaSet, .sharded]) - - let unmetRequirement = try client.getUnmetRequirement(testRequirements) + let unmetRequirement = try client.getUnmetRequirement(.changeStreamOnCollectionSupport) guard unmetRequirement == nil else { printSkipMessage(testName: self.name, unmetRequirement: unmetRequirement!) return @@ -149,11 +135,7 @@ final class ChangeStreamTests: MongoSwiftTestCase { let increment: (ChangeStreamEvent) -> Void = { _ in count += 1 } try self.withTestClient { client in - let testRequirements = TestRequirement( - acceptableTopologies: [.replicaSet, .sharded] - ) - - let unmetRequirement = try client.getUnmetRequirement(testRequirements) + let unmetRequirement = try client.getUnmetRequirement(.changeStreamOnCollectionSupport) guard unmetRequirement == nil else { printSkipMessage(testName: self.name, unmetRequirement: unmetRequirement!) return diff --git a/Tests/MongoSwiftTests/EventLoopBoundMongoClientTests.swift b/Tests/MongoSwiftTests/EventLoopBoundMongoClientTests.swift index 21debc838..100dc7064 100644 --- a/Tests/MongoSwiftTests/EventLoopBoundMongoClientTests.swift +++ b/Tests/MongoSwiftTests/EventLoopBoundMongoClientTests.swift @@ -83,12 +83,7 @@ final class EventLoopBoundMongoClientTests: MongoSwiftTestCase { let expectedEventLoop = elg.next() try self.withTestClient(eventLoopGroup: elg) { client in - let testRequirements = TestRequirement( - minServerVersion: ServerVersion(major: 4, minor: 0, patch: 0), - acceptableTopologies: [.replicaSet, .sharded] - ) - - let unmetRequirement = try client.getUnmetRequirement(testRequirements) + let unmetRequirement = try client.getUnmetRequirement(.changeStreamOnDBOrClientSupport) guard unmetRequirement == nil else { printSkipMessage(testName: self.name, unmetRequirement: unmetRequirement!) return @@ -112,11 +107,7 @@ final class EventLoopBoundMongoClientTests: MongoSwiftTestCase { let expectedEventLoop = elg.next() try self.withTestClient(eventLoopGroup: elg) { client in - let testRequirements = TestRequirement( - acceptableTopologies: [.replicaSet, .sharded] - ) - - let unmetRequirement = try client.getUnmetRequirement(testRequirements) + let unmetRequirement = try client.getUnmetRequirement(.changeStreamOnCollectionSupport) guard unmetRequirement == nil else { printSkipMessage(testName: self.name, unmetRequirement: unmetRequirement!) return @@ -286,7 +277,7 @@ final class EventLoopBoundMongoClientTests: MongoSwiftTestCase { try self.withTestClient(eventLoopGroup: elg) { client in let testRequirements = TestRequirement( minServerVersion: ServerVersion(major: 4, minor: 2, patch: 0), - acceptableTopologies: [.replicaSet, .sharded] + acceptableTopologies: [.replicaSet, .sharded, .shardedReplicaSet, .loadBalanced] ) let unmetRequirement = try client.getUnmetRequirement(testRequirements)