Skip to content

Commit 1696c73

Browse files
allevatobrentleyjones
authored andcommitted
Additional changes to XCTest symbol graph test discovery for Swift 6 compatibility
Making all of the discovered tests returned by `static func`s instead of stored `static let`s removes some problematic `@Sendable`-related function conversions that were causing a runtime crash when Swift 6 more is enabled. SwiftPM avoids this problem by... not ever compiling the discovered test runner in Swift 6 mode even if the package requests it. 🫤 PiperOrigin-RevId: 673829386 (cherry picked from commit 6988259) Signed-off-by: Brentley Jones <[email protected]>
1 parent b520f69 commit 1696c73

File tree

2 files changed

+20
-15
lines changed

2 files changed

+20
-15
lines changed

tools/test_discoverer/SymbolGraphTestPrinter.swift

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import Foundation
2121
/// function if necessary.
2222
private func generatedTestEntry(for method: DiscoveredTests.Method) -> String {
2323
if method.isAsync {
24-
return "asyncTest(\(method.name))"
24+
return "asyncTest({ type in type.\(method.name) })"
2525
} else {
2626
return method.name
2727
}
@@ -66,7 +66,7 @@ struct SymbolGraphTestPrinter {
6666

6767
var contents = """
6868
import XCTest
69-
@preconcurrency @testable import \(moduleName)
69+
@testable import \(moduleName)
7070
7171
"""
7272

@@ -78,20 +78,23 @@ struct SymbolGraphTestPrinter {
7878
7979
fileprivate extension \(className) {
8080
\(availabilityAttribute)
81-
@MainActor
82-
static let \(allTestsIdentifier(for: testClass)) = [
81+
static func \(allTestsIdentifier(for: testClass))()
82+
-> [(String, (\(className)) -> () throws -> Void)]
83+
{
84+
return [
8385
8486
"""
8587

8688
for testMethod in testClass.methods.sorted(by: { $0.name < $1.name }) {
8789
contents += """
88-
("\(testMethod.name)", \(generatedTestEntry(for: testMethod))),
90+
("\(testMethod.name)", \(generatedTestEntry(for: testMethod))),
8991
9092
"""
9193
}
9294

9395
contents += """
94-
]
96+
]
97+
}
9598
}
9699
97100
"""
@@ -101,20 +104,22 @@ struct SymbolGraphTestPrinter {
101104
102105
\(availabilityAttribute)
103106
@MainActor
104-
let \(allTestsIdentifier(for: discoveredModule)) = [
107+
func \(allTestsIdentifier(for: discoveredModule))() -> [XCTestCaseEntry] {
108+
return [
105109
106110
"""
107111

108112
for className in sortedClassNames {
109113
let testClass = discoveredModule.classes[className]!
110114
contents += """
111-
testCase(\(className).\(allTestsIdentifier(for: testClass))),
115+
testCase(\(className).\(allTestsIdentifier(for: testClass))()),
112116
113117
"""
114118
}
115119

116120
contents += """
117-
]
121+
]
122+
}
118123
119124
"""
120125

@@ -130,30 +135,30 @@ struct SymbolGraphTestPrinter {
130135
// be used instead.
131136
return """
132137
@MainActor
133-
private let __allDiscoveredXCTests: [XCTestCaseEntry] = []
138+
private func __allDiscoveredXCTests() -> [XCTestCaseEntry] { [] }
134139
135140
"""
136141
}
137142

138143
var contents = """
139144
\(availabilityAttribute)
140145
@MainActor
141-
private let __allDiscoveredXCTests: [XCTestCaseEntry] = {
146+
private func __allDiscoveredXCTests() -> [XCTestCaseEntry] {
142147
var allTests: [XCTestCaseEntry] = []
143148
144149
"""
145150

146151
for moduleName in discoveredTests.modules.keys.sorted() {
147152
let module = discoveredTests.modules[moduleName]!
148153
contents += """
149-
allTests.append(contentsOf: \(allTestsIdentifier(for: module)))
154+
allTests.append(contentsOf: \(allTestsIdentifier(for: module))())
150155
151156
"""
152157
}
153158

154159
contents += """
155160
return allTests
156-
}()
161+
}
157162
158163
"""
159164

tools/test_discoverer/TestDiscoverer.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ struct TestDiscoverer: ParsableCommand {
123123
exit(1)
124124
}
125125
do {
126-
try XCTestRunner.run(__allDiscoveredXCTests)
126+
try XCTestRunner.run(__allDiscoveredXCTests())
127127
} catch {
128128
print("Fatal error running XCTest tests: \\(error)")
129129
exit(1)
@@ -160,7 +160,7 @@ struct TestDiscoverer: ParsableCommand {
160160
// platforms.
161161
contents.append("""
162162
// Unused by the Objective-C XCTestRunner; tests are discovered by the runtime.
163-
private let __allDiscoveredXCTests: () = ()
163+
private func __allDiscoveredXCTests() {}
164164
165165
""")
166166
} else {

0 commit comments

Comments
 (0)