Skip to content

Commit 6d94d63

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 0b569a1 commit 6d94d63

5 files changed

+269
-243
lines changed

Tests/WorkspaceTests/AuthorizationProviderTests.swift

Lines changed: 42 additions & 28 deletions
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+
struct AuthorizationProviderTests {
20+
@Test
21+
func netrcAuthorizationProviders() throws {
2022
let observability = ObservabilitySystem.makeForTesting()
2123

2224
// custom .netrc file
@@ -34,17 +36,21 @@ final class AuthorizationProviderTests: XCTestCase {
3436
let authorizationProvider = try configuration.makeAuthorizationProvider(fileSystem: fileSystem, observabilityScope: observability.topScope) as? CompositeAuthorizationProvider
3537
let netrcProviders = 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

4043
let auth = authorizationProvider?.authentication(for: "https://mymachine.labkey.org")
41-
XCTAssertEqual(auth?.user, "[email protected]")
42-
XCTAssertEqual(auth?.password, "custom")
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 {
50+
try configuration.makeAuthorizationProvider(fileSystem: fileSystem, observabilityScope: observability.topScope)
51+
} throws: { error in
52+
let error = try #require(error as? StringError, "Error is wrong type")
53+
return error == StringError("Did not find netrc file at \(customPath).")
4854
}
4955
}
5056

@@ -63,23 +69,25 @@ final class AuthorizationProviderTests: XCTestCase {
6369
let authorizationProvider = try configuration.makeAuthorizationProvider(fileSystem: fileSystem, observabilityScope: observability.topScope) as? CompositeAuthorizationProvider
6470
let netrcProviders = authorizationProvider?.providers.compactMap { $0 as? NetrcAuthorizationProvider }
6571

66-
XCTAssertEqual(netrcProviders?.count, 1)
67-
XCTAssertEqual(try netrcProviders?.first.map { try resolveSymlinks($0.path) }, try resolveSymlinks(userPath))
72+
let expectedNetrcProvider = try resolveSymlinks(userPath)
73+
#expect(netrcProviders?.count == 1)
74+
#expect(try netrcProviders?.first.map { try resolveSymlinks($0.path) } == expectedNetrcProvider)
6875

6976
let auth = authorizationProvider?.authentication(for: "https://mymachine.labkey.org")
70-
XCTAssertEqual(auth?.user, "[email protected]")
71-
XCTAssertEqual(auth?.password, "user")
77+
#expect(auth?.user == "[email protected]")
78+
#expect(auth?.password == "user")
7279

7380
// delete it
7481
do {
7582
try fileSystem.removeFileTree(userPath)
7683
let authorizationProvider = try configuration.makeAuthorizationProvider(fileSystem: fileSystem, observabilityScope: observability.topScope) as? CompositeAuthorizationProvider
77-
XCTAssertNil(authorizationProvider)
84+
#expect(authorizationProvider == nil)
7885
}
7986
}
8087
}
8188

82-
func testRegistryNetrcAuthorizationProviders() throws {
89+
@Test
90+
func registryNetrcAuthorizationProviders() throws {
8391
let observability = ObservabilitySystem.makeForTesting()
8492

8593
// custom .netrc file
@@ -97,17 +105,21 @@ final class AuthorizationProviderTests: XCTestCase {
97105
let configuration = Workspace.Configuration.Authorization(netrc: .custom(customPath), keychain: .disabled)
98106
let netrcProvider = try configuration.makeRegistryAuthorizationProvider(fileSystem: fileSystem, observabilityScope: observability.topScope) as? NetrcAuthorizationProvider
99107

100-
XCTAssertNotNil(netrcProvider)
101-
XCTAssertEqual(try netrcProvider.map { try resolveSymlinks($0.path) }, try resolveSymlinks(customPath))
108+
let expectedNetrcProvider = try resolveSymlinks(customPath)
109+
#expect(netrcProvider != nil)
110+
#expect(try netrcProvider.map { try resolveSymlinks($0.path) } == expectedNetrcProvider)
102111

103112
let auth = netrcProvider?.authentication(for: "https://mymachine.labkey.org")
104-
XCTAssertEqual(auth?.user, "[email protected]")
105-
XCTAssertEqual(auth?.password, "custom")
113+
#expect(auth?.user == "[email protected]")
114+
#expect(auth?.password == "custom")
106115

107116
// delete it
108117
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)"))
118+
#expect {
119+
try configuration.makeRegistryAuthorizationProvider(fileSystem: fileSystem, observabilityScope: observability.topScope)
120+
} throws: { error in
121+
let error = try #require(error as? StringError, "Error is wrong type")
122+
return error == StringError("did not find netrc file at \(customPath)")
111123
}
112124
}
113125

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

129-
XCTAssertNotNil(netrcProvider)
130-
XCTAssertEqual(try netrcProvider.map { try resolveSymlinks($0.path) }, try resolveSymlinks(userPath))
141+
let expectedNetrcProvider = try resolveSymlinks(userPath)
142+
#expect(netrcProvider != nil)
143+
#expect(try netrcProvider.map { try resolveSymlinks($0.path) } == expectedNetrcProvider)
131144

132145
let auth = netrcProvider?.authentication(for: "https://mymachine.labkey.org")
133-
XCTAssertEqual(auth?.user, "[email protected]")
134-
XCTAssertEqual(auth?.password, "user")
146+
#expect(auth?.user == "[email protected]")
147+
#expect(auth?.password == "user")
135148

136149
// delete it
137150
do {
138151
try fileSystem.removeFileTree(userPath)
139152
let authorizationProvider = try configuration.makeRegistryAuthorizationProvider(fileSystem: fileSystem, observabilityScope: observability.topScope) as? NetrcAuthorizationProvider
140153
// 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))
154+
let expectedAuthorizationProvider = try resolveSymlinks(userPath)
155+
#expect(authorizationProvider != nil)
156+
#expect(try authorizationProvider.map { try resolveSymlinks($0.path) } == expectedAuthorizationProvider)
143157

144-
XCTAssertTrue(authorizationProvider!.machines.isEmpty)
158+
#expect(authorizationProvider!.machines.isEmpty)
145159
}
146160
}
147161
}

Tests/WorkspaceTests/MirrorsConfigurationTests.swift

Lines changed: 36 additions & 26 deletions
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+
struct MirrorsConfigurationTests {
19+
@Test
20+
func loadingSchema1() throws {
2021
let fs = InMemoryFileSystem()
2122
let configFile = AbsolutePath("/config/mirrors.json")
2223

@@ -42,70 +43,79 @@ 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 {
60+
try mirrors.unset(originalOrMirror: gitUrl)
61+
} throws: { error in
62+
let error = try #require(error as? StringError)
63+
return error == StringError("Mirror not found for '\(gitUrl)'")
5864
}
65+
5966
}
6067

61-
func testDeleteWhenEmpty() throws {
68+
@Test
69+
func deleteWhenEmpty() throws {
6270
let fs = InMemoryFileSystem()
6371
let configFile = AbsolutePath("/config/mirrors.json")
6472

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

6775
try config.apply{ _ in }
68-
XCTAssertFalse(fs.exists(configFile))
76+
#expect(!fs.exists(configFile))
6977

7078
let originalURL = "https://github.com/apple/swift-argument-parser.git"
7179
let mirrorURL = "https://github.com/mona/swift-argument-parser.git"
7280

7381
try config.apply{ mirrors in
7482
try mirrors.set(mirror: mirrorURL, for: originalURL)
7583
}
76-
XCTAssertTrue(fs.exists(configFile))
84+
#expect(fs.exists(configFile))
7785

7886
try config.apply{ mirrors in
7987
try mirrors.unset(originalOrMirror: originalURL)
8088
}
81-
XCTAssertFalse(fs.exists(configFile))
89+
#expect(!fs.exists(configFile))
8290
}
8391

84-
func testDontDeleteWhenEmpty() throws {
92+
@Test
93+
func dontDeleteWhenEmpty() throws {
8594
let fs = InMemoryFileSystem()
8695
let configFile = AbsolutePath("/config/mirrors.json")
8796

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

9099
try config.apply{ _ in }
91-
XCTAssertFalse(fs.exists(configFile))
100+
#expect(!fs.exists(configFile))
92101

93102
let originalURL = "https://github.com/apple/swift-argument-parser.git"
94103
let mirrorURL = "https://github.com/mona/swift-argument-parser.git"
95104

96105
try config.apply{ mirrors in
97106
try mirrors.set(mirror: mirrorURL, for: originalURL)
98107
}
99-
XCTAssertTrue(fs.exists(configFile))
108+
#expect(fs.exists(configFile))
100109

101110
try config.apply{ mirrors in
102111
try mirrors.unset(originalOrMirror: originalURL)
103112
}
104-
XCTAssertTrue(fs.exists(configFile))
105-
XCTAssertTrue(try config.get().isEmpty)
113+
#expect(fs.exists(configFile))
114+
#expect(try config.get().isEmpty)
106115
}
107116

108-
func testLocalAndShared() throws {
117+
@Test
118+
func localAndShared() throws {
109119
let fs = InMemoryFileSystem()
110120
let localConfigFile = AbsolutePath("/config/local-mirrors.json")
111121
let sharedConfigFile = AbsolutePath("/config/shared-mirrors.json")
@@ -125,9 +135,9 @@ final class MirrorsConfigurationTests: XCTestCase {
125135
try mirrors.set(mirror: mirror1URL, for: original1URL)
126136
}
127137

128-
XCTAssertEqual(config.mirrors.count, 1)
129-
XCTAssertEqual(config.mirrors.mirror(for: original1URL), mirror1URL)
130-
XCTAssertEqual(config.mirrors.original(for: mirror1URL), original1URL)
138+
#expect(config.mirrors.count == 1)
139+
#expect(config.mirrors.mirror(for: original1URL) == mirror1URL)
140+
#expect(config.mirrors.original(for: mirror1URL) == original1URL)
131141

132142
// now write to local location
133143

@@ -138,12 +148,12 @@ final class MirrorsConfigurationTests: XCTestCase {
138148
try mirrors.set(mirror: mirror2URL, for: original2URL)
139149
}
140150

141-
XCTAssertEqual(config.mirrors.count, 1)
142-
XCTAssertEqual(config.mirrors.mirror(for: original2URL), mirror2URL)
143-
XCTAssertEqual(config.mirrors.original(for: mirror2URL), original2URL)
151+
#expect(config.mirrors.count == 1)
152+
#expect(config.mirrors.mirror(for: original2URL) == mirror2URL)
153+
#expect(config.mirrors.original(for: mirror2URL) == original2URL)
144154

145155
// should not see the shared any longer
146-
XCTAssertEqual(config.mirrors.mirror(for: original1URL), nil)
147-
XCTAssertEqual(config.mirrors.original(for: mirror1URL), nil)
156+
#expect(config.mirrors.mirror(for: original1URL) == nil)
157+
#expect(config.mirrors.original(for: mirror1URL) == nil)
148158
}
149159
}

Tests/WorkspaceTests/ToolsVersionSpecificationGenerationTests.swift

Lines changed: 26 additions & 17 deletions
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+
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)