Skip to content

Commit 26a530d

Browse files
authored
SWIFT-871, SWIFT-1340 Reduce Evergreen matrix size, add TSan tasks (#674)
1 parent 53bc92d commit 26a530d

File tree

11 files changed

+183
-70
lines changed

11 files changed

+183
-70
lines changed

.evergreen/compile.sh

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
#!/bin/bash
2+
set -o xtrace # Write all commands first to stderr
3+
set -o errexit # Exit the script with error if any of the commands fail
4+
5+
# variables
6+
SWIFT_VERSION=${SWIFT_VERSION:-5.4.2}
7+
INSTALL_DIR="${PROJECT_DIRECTORY}/opt"
8+
OS=$(uname -s | tr '[:upper:]' '[:lower:]')
9+
10+
# enable swiftenv
11+
export SWIFTENV_ROOT="${INSTALL_DIR}/swiftenv"
12+
export PATH="${SWIFTENV_ROOT}/bin:$PATH"
13+
eval "$(swiftenv init -)"
14+
15+
if [ "$OS" == "darwin" ]; then
16+
# 5.1, 5.2 require an older version of Xcode/Command Line Tools
17+
if [[ "$SWIFT_VERSION" == 5.1.* || "$SWIFT_VERSION" == 5.2.* ]]; then
18+
sudo xcode-select -s /Applications/Xcode11.3.app
19+
else
20+
sudo xcode-select -s /Applications/Xcode12.app
21+
fi
22+
fi
23+
24+
# switch swift version and build
25+
swiftenv local $SWIFT_VERSION
26+
swift build

.evergreen/config.yml

Lines changed: 72 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,8 @@ functions:
160160
SWIFT_VERSION=${SWIFT_VERSION} \
161161
MONGODB_API_VERSION=${MONGODB_API_VERSION} \
162162
TEST_FILTER=${TEST_FILTER} \
163+
SANITIZE=${SANITIZE} \
164+
CHECK_LEAKS=${CHECK_LEAKS} \
163165
${PROJECT_DIRECTORY}/.evergreen/run-tests.sh
164166
165167
"upload test results":
@@ -356,6 +358,17 @@ functions:
356358
LINUX_SOURCEKIT_LIB_PATH=${PROJECT_DIRECTORY}/opt/swiftenv/versions/${SWIFT_VERSION}/usr/lib \
357359
${PROJECT_DIRECTORY}/opt/swiftlint/.build/release/swiftlint --strict --quiet
358360
361+
"compile":
362+
- command: shell.exec
363+
type: test
364+
params:
365+
working_dir: "src"
366+
script: |
367+
${PREPARE_SHELL}
368+
369+
SWIFT_VERSION=${SWIFT_VERSION} \
370+
${PROJECT_DIRECTORY}/.evergreen/compile.sh
371+
359372
start-load-balancer:
360373
- command: shell.exec
361374
params:
@@ -416,6 +429,10 @@ post:
416429
- func: "cleanup"
417430

418431
tasks:
432+
- name: "compile"
433+
commands:
434+
- func: "compile"
435+
419436
- name: "test-3.6-standalone"
420437
tags: ["3.6", "standalone"]
421438
commands:
@@ -1085,7 +1102,7 @@ axes:
10851102
- id: "5.4"
10861103
display_name: "Swift 5.4"
10871104
variables:
1088-
SWIFT_VERSION: "5.4"
1105+
SWIFT_VERSION: "5.4.2"
10891106
- id: "5.5-dev"
10901107
display_name: "Swift 5.5-dev"
10911108
variables:
@@ -1138,6 +1155,28 @@ axes:
11381155
ORCHESTRATION_FILE: "versioned-api-testing.json"
11391156
TEST_FILTER: "VersionedAPITests"
11401157

1158+
- id: sanitize
1159+
display_name: Sanitize
1160+
values:
1161+
- id: tsan
1162+
display_name: TSan
1163+
variables:
1164+
SANITIZE: "thread"
1165+
# ASan is unfortunately known to produce false positives in Swift, see
1166+
# https://forums.swift.org/t/test-for-memory-leaks-in-ci/36526/9
1167+
# - id: asan
1168+
# display_name: ASan
1169+
# variables:
1170+
# SANITIZE: "address"
1171+
1172+
- id: check-leaks
1173+
display_name: Check Leaks
1174+
values:
1175+
- id: leaks
1176+
display_name: Leaks
1177+
variables:
1178+
CHECK_LEAKS: leaks
1179+
11411180
task_groups:
11421181
- name: serverless_task_group
11431182
setup_group_can_fail_task: true
@@ -1174,40 +1213,22 @@ task_groups:
11741213
- ".serverless"
11751214

11761215
buildvariants:
1177-
# there are no 5.1 toolchains for Ubuntu 20.04. unfortunately as of now we cannot remove
1178-
# entire buildvariants via rule from the main matrix so we need to split this up. see EVG-13092
1179-
- matrix_name: "tests-5.1"
1216+
1217+
- matrix_name: "min-version-compile"
11801218
matrix_spec:
1219+
# Ubuntu 20.04 does not have Swift 5.1 toolchains.
11811220
os-fully-featured:
1182-
- "ubuntu-18.04"
11831221
- "macos-10.15"
1222+
- "ubuntu-18.04"
11841223
swift-version: "5.1"
1185-
ssl-auth: "*"
1186-
display_name: "${swift-version} ${os-fully-featured} ${ssl-auth}"
1224+
display_name: "Compile ${swift-version} ${os-fully-featured}"
11871225
tasks:
1188-
- ".latest !.load-balancer"
1189-
- ".5.0"
1190-
- ".4.4"
1191-
- ".4.2"
1192-
- ".4.0"
1193-
- ".3.6"
1194-
rules:
1195-
# MongoDB 3.6 does not have Ubuntu 18.04-specific Linux releases, so we just use
1196-
# generic Linux there. This do not link to OpenSSL, so we have to skip SSL tests.
1197-
- if:
1198-
os-fully-featured:
1199-
- "ubuntu-18.04"
1200-
swift-version: "*"
1201-
ssl-auth: "ssl-auth"
1202-
then:
1203-
remove_tasks:
1204-
- ".3.6"
1226+
- "compile"
12051227

12061228
- matrix_name: "tests-all"
12071229
matrix_spec:
12081230
os-fully-featured: "*"
12091231
swift-version:
1210-
- "5.2"
12111232
- "5.3"
12121233
- "5.4"
12131234
- "5.5-dev"
@@ -1245,23 +1266,10 @@ buildvariants:
12451266
- ".4.0"
12461267
- ".4.2"
12471268

1248-
# there are no 5.1 toolchains for Ubuntu 20.04. unfortunately as of now we cannot remove
1249-
# entire buildvariants via rule from the main matrix so we need to split this up. see EVG-13092
1250-
- matrix_name: "atlas-connect-5.1"
1251-
matrix_spec:
1252-
os-fully-featured:
1253-
- "macos-10.15"
1254-
- "ubuntu-18.04"
1255-
swift-version: "5.1"
1256-
display_name: "Atlas Connectivity ${swift-version} ${os-fully-featured}"
1257-
tasks:
1258-
- ".atlas-connect"
1259-
12601269
- matrix_name: "atlas-connect"
12611270
matrix_spec:
12621271
os-fully-featured: "*"
12631272
swift-version:
1264-
- "5.2"
12651273
- "5.3"
12661274
- "5.4"
12671275
- "5.5-dev"
@@ -1276,7 +1284,6 @@ buildvariants:
12761284
- "ubuntu-20.04"
12771285
ssl-auth: "*"
12781286
swift-version:
1279-
- "5.2"
12801287
- "5.3"
12811288
- "5.4"
12821289
- "5.5-dev"
@@ -1303,8 +1310,7 @@ buildvariants:
13031310
- latest
13041311
- 5.0
13051312
- 4.4
1306-
swift-version:
1307-
- 5.2
1313+
swift-version: "5.4"
13081314
display_name: "OCSP ${swift-version} ${os-fully-featured} ${versions}"
13091315
batchtime: 20160 # 14 days
13101316
tasks:
@@ -1321,10 +1327,8 @@ buildvariants:
13211327

13221328
- matrix_name: "ocsp-macos"
13231329
matrix_spec:
1324-
os-fully-featured:
1325-
- macos-10.15
1326-
swift-version:
1327-
- 5.2
1330+
os-fully-featured: "macos-10.15"
1331+
swift-version: "5.4"
13281332
versions:
13291333
- latest
13301334
- 5.0
@@ -1338,7 +1342,7 @@ buildvariants:
13381342
- matrix_name: "versioned-api-tests"
13391343
matrix_spec:
13401344
os-fully-featured: ubuntu-18.04
1341-
swift-version: "5.3"
1345+
swift-version: "5.4"
13421346
versionedAPI: "*"
13431347
display_name: "Versioned API ${versionedAPI} ${swift-version} ${os-fully-featured}"
13441348
batchtime: 10080 # 7 days
@@ -1350,7 +1354,7 @@ buildvariants:
13501354
display_name: "Format and Lint"
13511355
matrix_spec:
13521356
os-fully-featured: "ubuntu-18.04"
1353-
swift-version: "5.3"
1357+
swift-version: "5.4"
13541358
tasks:
13551359
- name: "check-format"
13561360
- name: "check-lint"
@@ -1359,6 +1363,26 @@ buildvariants:
13591363
display_name: "Check Sourcery"
13601364
matrix_spec:
13611365
os-fully-featured: "macos-10.15"
1362-
swift-version: "5.2"
1366+
swift-version: "5.4"
13631367
tasks:
13641368
- name: "check-sourcery"
1369+
1370+
- matrix_name: "sanitize"
1371+
display_name: "${sanitize} ${os-fully-featured} ${ssl-auth}"
1372+
matrix_spec:
1373+
os-fully-featured: "ubuntu-18.04"
1374+
swift-version: "5.4"
1375+
ssl-auth: "*"
1376+
sanitize: "tsan"
1377+
tasks:
1378+
- ".5.0"
1379+
1380+
- matrix_name: "leaks"
1381+
display_name: "Leak Checker ${os-fully-featured} ${ssl-auth}"
1382+
matrix_spec:
1383+
os-fully-featured: "macos-10.15"
1384+
swift-version: "5.4"
1385+
ssl-auth: "*"
1386+
check-leaks: "leaks"
1387+
tasks:
1388+
- ".5.0"

.evergreen/install-tools.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ swiftenv local $SWIFT_VERSION
3939

4040
if [ $1 == "swiftlint" ]
4141
then
42-
build_from_gh swiftlint https://github.com/realm/SwiftLint "0.41.0"
42+
build_from_gh swiftlint https://github.com/realm/SwiftLint "0.43.1"
4343
elif [ $1 == "swiftformat" ]
4444
then
4545
build_from_gh swiftformat https://github.com/nicklockwood/SwiftFormat "0.47.13"

.evergreen/run-tests.sh

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ RAW_TEST_RESULTS="${PROJECT_DIRECTORY}/rawTestResults"
1515
XML_TEST_RESULTS="${PROJECT_DIRECTORY}/testResults.xml"
1616
INSTALL_DEPS=${INSTALL_DEPS:-"false"}
1717
TEST_FILTER=${TEST_FILTER:-"NO_FILTER"}
18+
SANITIZE=${SANITIZE:-"false"}
1819

1920
# ssl setup
2021
SSL=${SSL:-nossl}
@@ -47,8 +48,13 @@ fi
4748
# switch swift version, and run tests
4849
swiftenv local $SWIFT_VERSION
4950

51+
SANITIZE_STATEMENT=""
52+
if [ "$SANITIZE" != "false" ]; then
53+
SANITIZE_STATEMENT="--sanitize ${SANITIZE}"
54+
fi
55+
5056
# build the driver
51-
swift build
57+
swift build $SANITIZE_STATEMENT
5258

5359
# test the driver
5460
set +o errexit # even if tests fail we want to parse the results, so disable errexit
@@ -62,7 +68,7 @@ fi
6268

6369
MONGODB_TOPOLOGY=${TOPOLOGY} MONGODB_URI=$MONGODB_URI SINGLE_MONGOS_LB_URI=$SINGLE_MONGOS_LB_URI \
6470
MULTI_MONGOS_LB_URI=$MULTI_MONGOS_LB_URI MONGODB_API_VERSION=$MONGODB_API_VERSION \
65-
swift test $FILTER_STATEMENT 2>&1 | tee ${RAW_TEST_RESULTS}
71+
swift test $FILTER_STATEMENT $SANITIZE_STATEMENT 2>&1 | tee ${RAW_TEST_RESULTS}
6672

6773
# save tests exit code
6874
EXIT_CODE=$?

.swift-version

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
5.2
1+
5.4.2

Package.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ let package = Package(
2020
.target(name: "AtlasConnectivity", dependencies: ["MongoSwiftSync"]),
2121
.target(name: "TestsCommon", dependencies: ["MongoSwift", "Nimble"]),
2222
.testTarget(name: "BSONTests", dependencies: ["MongoSwift", "TestsCommon", "Nimble", "CLibMongoC"]),
23-
.testTarget(name: "MongoSwiftTests", dependencies: ["MongoSwift", "TestsCommon", "Nimble", "NIO"]),
23+
.testTarget(name: "MongoSwiftTests", dependencies: ["MongoSwift", "TestsCommon", "Nimble", "NIO", "NIOConcurrencyHelpers"]),
2424
.testTarget(name: "MongoSwiftSyncTests", dependencies: ["MongoSwiftSync", "TestsCommon", "Nimble", "MongoSwift"]),
2525
.target(
2626
name: "CLibMongoC",

Tests/LinuxMain.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,12 @@ extension EventLoopBoundMongoClientTests {
112112
]
113113
}
114114

115+
extension LeakCheckTests {
116+
static var allTests = [
117+
("testLeaks", testLeaks),
118+
]
119+
}
120+
115121
extension LoadBalancerTests {
116122
static var allTests = [
117123
("testLoadBalancers", testLoadBalancers),
@@ -406,6 +412,7 @@ XCTMain([
406412
testCase(CrudTests.allTests),
407413
testCase(DNSSeedlistTests.allTests),
408414
testCase(EventLoopBoundMongoClientTests.allTests),
415+
testCase(LeakCheckTests.allTests),
409416
testCase(LoadBalancerTests.allTests),
410417
testCase(MongoClientTests.allTests),
411418
testCase(MongoCollectionTests.allTests),

Tests/MongoSwiftSyncTests/SyncMongoClientTests.swift

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import Foundation
22
import MongoSwiftSync
33
import Nimble
4+
import NIOConcurrencyHelpers
45
import TestsCommon
56
import XCTest
67

@@ -272,21 +273,22 @@ final class SyncMongoClientTests: MongoSwiftTestCase {
272273
func testAPMCallbacks() throws {
273274
let client = try MongoClient.makeTestClient()
274275

275-
var commandEvents: [CommandEvent] = []
276-
client.addCommandEventHandler { event in
277-
commandEvents.append(event)
276+
let commandEventCount = NIOAtomic<Int>.makeAtomic(value: 0)
277+
let sdamEventCount = NIOAtomic<Int>.makeAtomic(value: 0)
278+
279+
client.addCommandEventHandler { _ in
280+
_ = commandEventCount.add(1)
278281
}
279282

280-
var sdamEvents: [SDAMEvent] = []
281-
client.addSDAMEventHandler { event in
282-
sdamEvents.append(event)
283+
client.addSDAMEventHandler { _ in
284+
_ = sdamEventCount.add(1)
283285
}
284286

285287
// don't care if command fails, just testing that the events were emitted
286288
_ = try? client.listDatabases()
287289

288-
expect(commandEvents).toEventually(haveCount(2)) // wait for started and succeeded / failed
289-
expect(sdamEvents.isEmpty).toEventually(beFalse())
290+
expect(commandEventCount.load()).toEventually(equal(2)) // wait for started and succeeded / failed
291+
expect(sdamEventCount.load()).toEventuallyNot(equal(0))
290292
}
291293

292294
func testCertificateVerificationOptions() throws {

Tests/MongoSwiftTests/ChangeStreamTests.swift

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import Foundation
22
import MongoSwift
33
import Nimble
44
import NIO
5+
import NIOConcurrencyHelpers
56
import TestsCommon
67

78
final class ChangeStreamTests: MongoSwiftTestCase {
@@ -131,8 +132,8 @@ final class ChangeStreamTests: MongoSwiftTestCase {
131132
}
132133

133134
func testChangeStreamForEach() throws {
134-
var count = 0
135-
let increment: (ChangeStreamEvent<BSONDocument>) -> Void = { _ in count += 1 }
135+
let count = NIOAtomic<Int>.makeAtomic(value: 0)
136+
let increment: (ChangeStreamEvent<BSONDocument>) -> Void = { _ in count.add(1) }
136137

137138
try self.withTestClient { client in
138139
let unmetRequirement = try client.getUnmetRequirement(.changeStreamOnCollectionSupport)
@@ -151,10 +152,10 @@ final class ChangeStreamTests: MongoSwiftTestCase {
151152
let future = stream.forEach(increment)
152153

153154
_ = try coll.insertOne(["x": 1]).wait()
154-
expect(count).toEventually(equal(1), timeout: 10)
155+
expect(count.load()).toEventually(equal(1), timeout: 10)
155156

156157
_ = try coll.insertOne(["x": 2]).wait()
157-
expect(count).toEventually(equal(2), timeout: 10)
158+
expect(count.load()).toEventually(equal(2), timeout: 10)
158159

159160
try stream.kill().wait()
160161
expect(try future.wait()).toNot(throwError())

0 commit comments

Comments
 (0)