Skip to content

Commit d2c0549

Browse files
committed
Convert most WorkspaceTests to Swift Testing
Convert most of the WorkspaceTests from XCTests to Swift Testing to make use of parallelism and, in some cases, test parameterization. Not all Test Suites in WorkspaceTests have been converted as some use helpers in swift-tools-core-support, which don't have a matching Swift Testing helper.
1 parent c8d439a commit d2c0549

5 files changed

+264
-250
lines changed

Tests/WorkspaceTests/AuthorizationProviderTests.swift

+42-34
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,16 @@
99
// See http://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
1010
//
1111
//===----------------------------------------------------------------------===//
12+
import Foundation
1213

1314
@testable import Basics
1415
import _InternalTestSupport
1516
import Workspace
16-
import XCTest
17+
import Testing
1718

18-
final class AuthorizationProviderTests: XCTestCase {
19-
func testNetrcAuthorizationProviders() throws {
19+
fileprivate struct AuthorizationProviderTests {
20+
@Test
21+
func netrcAuthorizationProviders() throws {
2022
let observability = ObservabilitySystem.makeForTesting()
2123

2224
// custom .netrc file
@@ -32,19 +34,20 @@ final class AuthorizationProviderTests: XCTestCase {
3234

3335
let configuration = Workspace.Configuration.Authorization(netrc: .custom(customPath), keychain: .disabled)
3436
let authorizationProvider = try configuration.makeAuthorizationProvider(fileSystem: fileSystem, observabilityScope: observability.topScope) as? CompositeAuthorizationProvider
35-
let netrcProviders = authorizationProvider?.providers.compactMap { $0 as? NetrcAuthorizationProvider }
37+
let netrcProviders = try #require(authorizationProvider?.providers.compactMap { $0 as? NetrcAuthorizationProvider })
3638

37-
XCTAssertEqual(netrcProviders?.count, 1)
38-
XCTAssertEqual(try netrcProviders?.first.map { try resolveSymlinks($0.path) }, try resolveSymlinks(customPath))
39+
let expectedNetrcProvider = try resolveSymlinks(customPath)
40+
#expect(netrcProviders.count == 1)
41+
#expect(try netrcProviders.first.map { try resolveSymlinks($0.path) } == expectedNetrcProvider)
3942

40-
let auth = authorizationProvider?.authentication(for: "https://mymachine.labkey.org")
41-
XCTAssertEqual(auth?.user, "[email protected]")
42-
XCTAssertEqual(auth?.password, "custom")
43+
let auth = try #require(authorizationProvider?.authentication(for: "https://mymachine.labkey.org"))
44+
#expect(auth.user == "[email protected]")
45+
#expect(auth.password == "custom")
4346

4447
// delete it
4548
try fileSystem.removeFileTree(customPath)
46-
XCTAssertThrowsError(try configuration.makeAuthorizationProvider(fileSystem: fileSystem, observabilityScope: observability.topScope), "error expected") { error in
47-
XCTAssertEqual(error as? StringError, StringError("Did not find netrc file at \(customPath)."))
49+
#expect(throws: StringError("Did not find netrc file at \(customPath).")) {
50+
try configuration.makeAuthorizationProvider(fileSystem: fileSystem, observabilityScope: observability.topScope)
4851
}
4952
}
5053

@@ -61,25 +64,27 @@ final class AuthorizationProviderTests: XCTestCase {
6164

6265
let configuration = Workspace.Configuration.Authorization(netrc: .user, keychain: .disabled)
6366
let authorizationProvider = try configuration.makeAuthorizationProvider(fileSystem: fileSystem, observabilityScope: observability.topScope) as? CompositeAuthorizationProvider
64-
let netrcProviders = authorizationProvider?.providers.compactMap { $0 as? NetrcAuthorizationProvider }
67+
let netrcProviders = try #require(authorizationProvider?.providers.compactMap { $0 as? NetrcAuthorizationProvider })
6568

66-
XCTAssertEqual(netrcProviders?.count, 1)
67-
XCTAssertEqual(try netrcProviders?.first.map { try resolveSymlinks($0.path) }, try resolveSymlinks(userPath))
69+
let expectedNetrcProvider = try resolveSymlinks(userPath)
70+
#expect(netrcProviders.count == 1)
71+
#expect(try netrcProviders.first.map { try resolveSymlinks($0.path) } == expectedNetrcProvider)
6872

69-
let auth = authorizationProvider?.authentication(for: "https://mymachine.labkey.org")
70-
XCTAssertEqual(auth?.user, "[email protected]")
71-
XCTAssertEqual(auth?.password, "user")
73+
let auth = try #require(authorizationProvider?.authentication(for: "https://mymachine.labkey.org"))
74+
#expect(auth.user == "[email protected]")
75+
#expect(auth.password == "user")
7276

7377
// delete it
7478
do {
7579
try fileSystem.removeFileTree(userPath)
7680
let authorizationProvider = try configuration.makeAuthorizationProvider(fileSystem: fileSystem, observabilityScope: observability.topScope) as? CompositeAuthorizationProvider
77-
XCTAssertNil(authorizationProvider)
81+
#expect(authorizationProvider == nil)
7882
}
7983
}
8084
}
8185

82-
func testRegistryNetrcAuthorizationProviders() throws {
86+
@Test
87+
func registryNetrcAuthorizationProviders() throws {
8388
let observability = ObservabilitySystem.makeForTesting()
8489

8590
// custom .netrc file
@@ -97,17 +102,18 @@ final class AuthorizationProviderTests: XCTestCase {
97102
let configuration = Workspace.Configuration.Authorization(netrc: .custom(customPath), keychain: .disabled)
98103
let netrcProvider = try configuration.makeRegistryAuthorizationProvider(fileSystem: fileSystem, observabilityScope: observability.topScope) as? NetrcAuthorizationProvider
99104

100-
XCTAssertNotNil(netrcProvider)
101-
XCTAssertEqual(try netrcProvider.map { try resolveSymlinks($0.path) }, try resolveSymlinks(customPath))
105+
let expectedNetrcProvider = try resolveSymlinks(customPath)
106+
#expect(netrcProvider != nil)
107+
#expect(try netrcProvider.map { try resolveSymlinks($0.path) } == expectedNetrcProvider)
102108

103-
let auth = netrcProvider?.authentication(for: "https://mymachine.labkey.org")
104-
XCTAssertEqual(auth?.user, "[email protected]")
105-
XCTAssertEqual(auth?.password, "custom")
109+
let auth = try #require(netrcProvider?.authentication(for: "https://mymachine.labkey.org"))
110+
#expect(auth.user == "[email protected]")
111+
#expect(auth.password == "custom")
106112

107113
// delete it
108114
try fileSystem.removeFileTree(customPath)
109-
XCTAssertThrowsError(try configuration.makeRegistryAuthorizationProvider(fileSystem: fileSystem, observabilityScope: observability.topScope), "error expected") { error in
110-
XCTAssertEqual(error as? StringError, StringError("did not find netrc file at \(customPath)"))
115+
#expect(throws: StringError("did not find netrc file at \(customPath)")) {
116+
try configuration.makeRegistryAuthorizationProvider(fileSystem: fileSystem, observabilityScope: observability.topScope)
111117
}
112118
}
113119

@@ -126,22 +132,24 @@ final class AuthorizationProviderTests: XCTestCase {
126132
let configuration = Workspace.Configuration.Authorization(netrc: .user, keychain: .disabled)
127133
let netrcProvider = try configuration.makeRegistryAuthorizationProvider(fileSystem: fileSystem, observabilityScope: observability.topScope) as? NetrcAuthorizationProvider
128134

129-
XCTAssertNotNil(netrcProvider)
130-
XCTAssertEqual(try netrcProvider.map { try resolveSymlinks($0.path) }, try resolveSymlinks(userPath))
135+
let expectedNetrcProvider = try resolveSymlinks(userPath)
136+
#expect(netrcProvider != nil)
137+
#expect(try netrcProvider.map { try resolveSymlinks($0.path) } == expectedNetrcProvider)
131138

132-
let auth = netrcProvider?.authentication(for: "https://mymachine.labkey.org")
133-
XCTAssertEqual(auth?.user, "[email protected]")
134-
XCTAssertEqual(auth?.password, "user")
139+
let auth = try #require(netrcProvider?.authentication(for: "https://mymachine.labkey.org"))
140+
#expect(auth.user == "[email protected]")
141+
#expect(auth.password == "user")
135142

136143
// delete it
137144
do {
138145
try fileSystem.removeFileTree(userPath)
139146
let authorizationProvider = try configuration.makeRegistryAuthorizationProvider(fileSystem: fileSystem, observabilityScope: observability.topScope) as? NetrcAuthorizationProvider
140147
// Even if user .netrc file doesn't exist, the provider will be non-nil but contain no data.
141-
XCTAssertNotNil(authorizationProvider)
142-
XCTAssertEqual(try authorizationProvider.map { try resolveSymlinks($0.path) }, try resolveSymlinks(userPath))
148+
let expectedAuthorizationProvider = try resolveSymlinks(userPath)
149+
#expect(authorizationProvider != nil)
150+
#expect(try authorizationProvider.map { try resolveSymlinks($0.path) } == expectedAuthorizationProvider)
143151

144-
XCTAssertTrue(authorizationProvider!.machines.isEmpty)
152+
#expect(authorizationProvider!.machines.isEmpty)
145153
}
146154
}
147155
}

Tests/WorkspaceTests/MirrorsConfigurationTests.swift

+32-26
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,11 @@
1313
import Basics
1414
import _InternalTestSupport
1515
import Workspace
16-
import XCTest
16+
import Testing
1717

18-
final class MirrorsConfigurationTests: XCTestCase {
19-
func testLoadingSchema1() throws {
18+
fileprivate struct MirrorsConfigurationTests {
19+
@Test
20+
func loadingSchema1() throws {
2021
let fs = InMemoryFileSystem()
2122
let configFile = AbsolutePath("/config/mirrors.json")
2223

@@ -42,70 +43,75 @@ final class MirrorsConfigurationTests: XCTestCase {
4243
let config = Workspace.Configuration.MirrorsStorage(path: configFile, fileSystem: fs, deleteWhenEmpty: true)
4344
let mirrors = try config.get()
4445

45-
XCTAssertEqual(mirrors.mirror(for: originalURL),mirrorURL)
46-
XCTAssertEqual(mirrors.original(for: mirrorURL), originalURL)
46+
#expect(mirrors.mirror(for: originalURL) == mirrorURL)
47+
#expect(mirrors.original(for: mirrorURL) == originalURL)
4748
}
4849

49-
func testThrowsWhenNotFound() throws {
50+
@Test
51+
func throwsWhenNotFound() throws {
52+
let gitUrl = "https://github.com/apple/swift-argument-parser.git"
5053
let fs = InMemoryFileSystem()
5154
let configFile = AbsolutePath("/config/mirrors.json")
5255

5356
let config = Workspace.Configuration.MirrorsStorage(path: configFile, fileSystem: fs, deleteWhenEmpty: true)
5457
let mirrors = try config.get()
5558

56-
XCTAssertThrows(StringError("Mirror not found for 'https://github.com/apple/swift-argument-parser.git'")) {
57-
try mirrors.unset(originalOrMirror: "https://github.com/apple/swift-argument-parser.git")
59+
#expect(throws: StringError("Mirror not found for '\(gitUrl)'")) {
60+
try mirrors.unset(originalOrMirror: gitUrl)
5861
}
5962
}
6063

61-
func testDeleteWhenEmpty() throws {
64+
@Test
65+
func deleteWhenEmpty() throws {
6266
let fs = InMemoryFileSystem()
6367
let configFile = AbsolutePath("/config/mirrors.json")
6468

6569
let config = Workspace.Configuration.MirrorsStorage(path: configFile, fileSystem: fs, deleteWhenEmpty: true)
6670

6771
try config.apply{ _ in }
68-
XCTAssertFalse(fs.exists(configFile))
72+
#expect(!fs.exists(configFile))
6973

7074
let originalURL = "https://github.com/apple/swift-argument-parser.git"
7175
let mirrorURL = "https://github.com/mona/swift-argument-parser.git"
7276

7377
try config.apply{ mirrors in
7478
try mirrors.set(mirror: mirrorURL, for: originalURL)
7579
}
76-
XCTAssertTrue(fs.exists(configFile))
80+
#expect(fs.exists(configFile))
7781

7882
try config.apply{ mirrors in
7983
try mirrors.unset(originalOrMirror: originalURL)
8084
}
81-
XCTAssertFalse(fs.exists(configFile))
85+
#expect(!fs.exists(configFile))
8286
}
8387

84-
func testDontDeleteWhenEmpty() throws {
88+
@Test
89+
func dontDeleteWhenEmpty() throws {
8590
let fs = InMemoryFileSystem()
8691
let configFile = AbsolutePath("/config/mirrors.json")
8792

8893
let config = Workspace.Configuration.MirrorsStorage(path: configFile, fileSystem: fs, deleteWhenEmpty: false)
8994

9095
try config.apply{ _ in }
91-
XCTAssertFalse(fs.exists(configFile))
96+
#expect(!fs.exists(configFile))
9297

9398
let originalURL = "https://github.com/apple/swift-argument-parser.git"
9499
let mirrorURL = "https://github.com/mona/swift-argument-parser.git"
95100

96101
try config.apply{ mirrors in
97102
try mirrors.set(mirror: mirrorURL, for: originalURL)
98103
}
99-
XCTAssertTrue(fs.exists(configFile))
104+
#expect(fs.exists(configFile))
100105

101106
try config.apply{ mirrors in
102107
try mirrors.unset(originalOrMirror: originalURL)
103108
}
104-
XCTAssertTrue(fs.exists(configFile))
105-
XCTAssertTrue(try config.get().isEmpty)
109+
#expect(fs.exists(configFile))
110+
#expect(try config.get().isEmpty)
106111
}
107112

108-
func testLocalAndShared() throws {
113+
@Test
114+
func localAndShared() throws {
109115
let fs = InMemoryFileSystem()
110116
let localConfigFile = AbsolutePath("/config/local-mirrors.json")
111117
let sharedConfigFile = AbsolutePath("/config/shared-mirrors.json")
@@ -125,9 +131,9 @@ final class MirrorsConfigurationTests: XCTestCase {
125131
try mirrors.set(mirror: mirror1URL, for: original1URL)
126132
}
127133

128-
XCTAssertEqual(config.mirrors.count, 1)
129-
XCTAssertEqual(config.mirrors.mirror(for: original1URL), mirror1URL)
130-
XCTAssertEqual(config.mirrors.original(for: mirror1URL), original1URL)
134+
#expect(config.mirrors.count == 1)
135+
#expect(config.mirrors.mirror(for: original1URL) == mirror1URL)
136+
#expect(config.mirrors.original(for: mirror1URL) == original1URL)
131137

132138
// now write to local location
133139

@@ -138,12 +144,12 @@ final class MirrorsConfigurationTests: XCTestCase {
138144
try mirrors.set(mirror: mirror2URL, for: original2URL)
139145
}
140146

141-
XCTAssertEqual(config.mirrors.count, 1)
142-
XCTAssertEqual(config.mirrors.mirror(for: original2URL), mirror2URL)
143-
XCTAssertEqual(config.mirrors.original(for: mirror2URL), original2URL)
147+
#expect(config.mirrors.count == 1)
148+
#expect(config.mirrors.mirror(for: original2URL) == mirror2URL)
149+
#expect(config.mirrors.original(for: mirror2URL) == original2URL)
144150

145151
// should not see the shared any longer
146-
XCTAssertEqual(config.mirrors.mirror(for: original1URL), nil)
147-
XCTAssertEqual(config.mirrors.original(for: mirror1URL), nil)
152+
#expect(config.mirrors.mirror(for: original1URL) == nil)
153+
#expect(config.mirrors.original(for: mirror1URL) == nil)
148154
}
149155
}

Tests/WorkspaceTests/ToolsVersionSpecificationGenerationTests.swift

+26-17
Original file line numberDiff line numberDiff line change
@@ -9,36 +9,45 @@
99
// See http://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
1010
//
1111
//===----------------------------------------------------------------------===//
12+
import Foundation
1213

1314
///
1415
/// This file tests the generation of a Swift tools version specification from a known version.
1516
///
1617

17-
import XCTest
18+
import Testing
1819
import PackageModel
1920

2021
import struct TSCUtility.Version
2122

2223
/// Test cases for the generation of Swift tools version specifications.
23-
class ToolsVersionSpecificationGenerationTests: XCTestCase {
24+
fileprivate struct ToolsVersionSpecificationGenerationTests {
2425
/// Tests the generation of Swift tools version specifications.
25-
func testToolsVersionSpecificationGeneration() throws {
26+
@Test
27+
func toolsVersionSpecificationGeneration() throws {
2628
let versionWithNonZeroPatch = ToolsVersion(version: Version(4, 3, 2))
27-
XCTAssertEqual(versionWithNonZeroPatch.specification(), "// swift-tools-version:4.3.2")
28-
XCTAssertEqual(versionWithNonZeroPatch.specification(roundedTo: .automatic), "// swift-tools-version:4.3.2")
29-
XCTAssertEqual(versionWithNonZeroPatch.specification(roundedTo: .minor), "// swift-tools-version:4.3")
30-
XCTAssertEqual(versionWithNonZeroPatch.specification(roundedTo: .patch), "// swift-tools-version:4.3.2")
31-
29+
#expect(versionWithNonZeroPatch.specification() == "// swift-tools-version:4.3.2")
30+
#expect(versionWithNonZeroPatch.specification(roundedTo: .automatic) == "// swift-tools-version:4.3.2")
31+
#expect(versionWithNonZeroPatch.specification(roundedTo: .minor) == "// swift-tools-version:4.3")
32+
#expect(versionWithNonZeroPatch.specification(roundedTo: .patch) == "// swift-tools-version:4.3.2")
33+
3234
let versionWithZeroPatch = ToolsVersion.v5_3 // 5.3.0
33-
XCTAssertEqual(versionWithZeroPatch.specification(), "// swift-tools-version:5.3")
34-
XCTAssertEqual(versionWithZeroPatch.specification(roundedTo: .automatic), "// swift-tools-version:5.3")
35-
XCTAssertEqual(versionWithZeroPatch.specification(roundedTo: .minor), "// swift-tools-version:5.3")
36-
XCTAssertEqual(versionWithZeroPatch.specification(roundedTo: .patch), "// swift-tools-version:5.3.0")
37-
35+
#expect(versionWithZeroPatch.specification() == "// swift-tools-version:5.3")
36+
#expect(versionWithZeroPatch.specification(roundedTo: .automatic) == "// swift-tools-version:5.3")
37+
#expect(versionWithZeroPatch.specification(roundedTo: .minor) == "// swift-tools-version:5.3")
38+
#expect(versionWithZeroPatch.specification(roundedTo: .patch) == "// swift-tools-version:5.3.0")
39+
3840
let newMajorVersion = ToolsVersion.v5 // 5.0.0
39-
XCTAssertEqual(newMajorVersion.specification(), "// swift-tools-version:5.0")
40-
XCTAssertEqual(newMajorVersion.specification(roundedTo: .automatic), "// swift-tools-version:5.0")
41-
XCTAssertEqual(newMajorVersion.specification(roundedTo: .minor), "// swift-tools-version:5.0")
42-
XCTAssertEqual(newMajorVersion.specification(roundedTo: .patch), "// swift-tools-version:5.0.0")
41+
#expect(newMajorVersion.specification() == "// swift-tools-version:5.0")
42+
#expect(newMajorVersion.specification(roundedTo: .automatic) == "// swift-tools-version:5.0")
43+
#expect(newMajorVersion.specification(roundedTo: .minor) == "// swift-tools-version:5.0")
44+
#expect(newMajorVersion.specification(roundedTo: .patch) == "// swift-tools-version:5.0.0")
45+
46+
let allZeroVersion = ToolsVersion(version: Version(0, 0, 0))
47+
#expect(allZeroVersion.specification() == "// swift-tools-version:0.0")
48+
#expect(allZeroVersion.specification(roundedTo: .automatic) == "// swift-tools-version:0.0")
49+
#expect(allZeroVersion.specification(roundedTo: .minor) == "// swift-tools-version:0.0")
50+
#expect(allZeroVersion.specification(roundedTo: .patch) == "// swift-tools-version:0.0.0")
4351
}
52+
4453
}

0 commit comments

Comments
 (0)