Skip to content

Commit d91213d

Browse files
authored
Revert "Allow opting into Swift Testing entrypoints for macOS test bundles when building with the SwiftPM CLI" (#727)
This reverts commit 5d14073.
1 parent 133b147 commit d91213d

File tree

6 files changed

+53
-145
lines changed

6 files changed

+53
-145
lines changed

Sources/SWBCore/Settings/BuiltinMacros.swift

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -726,7 +726,6 @@ public final class BuiltinMacros {
726726
public static let GENERATE_RESOURCE_ACCESSORS = BuiltinMacros.declareBooleanMacro("GENERATE_RESOURCE_ACCESSORS")
727727
public static let GENERATE_TEST_ENTRY_POINT = BuiltinMacros.declareBooleanMacro("GENERATE_TEST_ENTRY_POINT")
728728
public static let GENERATED_TEST_ENTRY_POINT_PATH = BuiltinMacros.declarePathMacro("GENERATED_TEST_ENTRY_POINT_PATH")
729-
public static let GENERATED_TEST_ENTRY_POINT_INCLUDE_DISCOVERED_TESTS = BuiltinMacros.declareBooleanMacro("GENERATED_TEST_ENTRY_POINT_INCLUDE_DISCOVERED_TESTS")
730729
public static let GENERATE_TEXT_BASED_STUBS = BuiltinMacros.declareBooleanMacro("GENERATE_TEXT_BASED_STUBS")
731730
public static let GENERATE_INTERMEDIATE_TEXT_BASED_STUBS = BuiltinMacros.declareBooleanMacro("GENERATE_INTERMEDIATE_TEXT_BASED_STUBS")
732731
public static let GLOBAL_API_NOTES_PATH = BuiltinMacros.declareStringMacro("GLOBAL_API_NOTES_PATH")
@@ -1793,7 +1792,6 @@ public final class BuiltinMacros {
17931792
GENERATE_RESOURCE_ACCESSORS,
17941793
GENERATE_TEST_ENTRY_POINT,
17951794
GENERATED_TEST_ENTRY_POINT_PATH,
1796-
GENERATED_TEST_ENTRY_POINT_INCLUDE_DISCOVERED_TESTS,
17971795
GENERATE_TEXT_BASED_STUBS,
17981796
GENERATE_INTERMEDIATE_TEXT_BASED_STUBS,
17991797
GID,

Sources/SWBUniversalPlatform/Specs/ProductTypes.xcspec

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -335,9 +335,6 @@
335335

336336
PROVISIONING_PROFILE_SUPPORTED = YES;
337337
PROVISIONING_PROFILE_REQUIRED = NO;
338-
339-
GENERATE_TEST_ENTRY_POINT = "$(GENERATE_TEST_ENTRYPOINTS_FOR_BUNDLES)";
340-
GENERATED_TEST_ENTRY_POINT_PATH = "$(DERIVED_SOURCES_DIR)/test_entry_point.swift";
341338
};
342339
PackageTypes = (
343340
com.apple.package-type.bundle.unit-test
@@ -356,7 +353,6 @@
356353
ENABLE_TESTING_SEARCH_PATHS = YES;
357354
GENERATE_TEST_ENTRY_POINT = YES;
358355
GENERATED_TEST_ENTRY_POINT_PATH = "$(DERIVED_SOURCES_DIR)/test_entry_point.swift";
359-
GENERATED_TEST_ENTRY_POINT_INCLUDE_DISCOVERED_TESTS = YES;
360356
};
361357
PackageTypes = (
362358
com.apple.package-type.mach-o-executable

Sources/SWBUniversalPlatform/TestEntryPointGenerationTaskAction.swift

Lines changed: 43 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -25,30 +25,24 @@ class TestEntryPointGenerationTaskAction: TaskAction {
2525
let options = try Options.parse(Array(task.commandLineAsStrings.dropFirst()))
2626

2727
var tests: [IndexStore.TestCaseClass] = []
28-
if options.discoverTests {
29-
var objects: [Path] = []
30-
for linkerFilelist in options.linkerFilelist {
31-
let filelistContents = String(String(decoding: try executionDelegate.fs.read(linkerFilelist), as: UTF8.self))
32-
let entries = filelistContents.split(separator: "\n", omittingEmptySubsequences: true).map { Path($0) }.map {
33-
for indexUnitBasePath in options.indexUnitBasePath {
34-
if let remappedPath = generateIndexOutputPath(from: $0, basePath: indexUnitBasePath) {
35-
return remappedPath
36-
}
28+
var objects: [Path] = []
29+
for linkerFilelist in options.linkerFilelist {
30+
let filelistContents = String(String(decoding: try executionDelegate.fs.read(linkerFilelist), as: UTF8.self))
31+
let entries = filelistContents.split(separator: "\n", omittingEmptySubsequences: true).map { Path($0) }.map {
32+
for indexUnitBasePath in options.indexUnitBasePath {
33+
if let remappedPath = generateIndexOutputPath(from: $0, basePath: indexUnitBasePath) {
34+
return remappedPath
3735
}
38-
return $0
3936
}
40-
objects.append(contentsOf: entries)
41-
}
42-
guard let indexStoreLibraryPath = options.indexStoreLibraryPath else {
43-
outputDelegate.emitError("Test discovery was requested, but failed to lookup index store library in toolchain")
44-
return .failed
45-
}
46-
let indexStoreAPI = try IndexStoreAPI(dylib: indexStoreLibraryPath)
47-
for indexStore in options.indexStore {
48-
let store = try IndexStore.open(store: indexStore, api: indexStoreAPI)
49-
let testInfo = try store.listTests(in: objects)
50-
tests.append(contentsOf: testInfo)
37+
return $0
5138
}
39+
objects.append(contentsOf: entries)
40+
}
41+
let indexStoreAPI = try IndexStoreAPI(dylib: options.indexStoreLibraryPath)
42+
for indexStore in options.indexStore {
43+
let store = try IndexStore.open(store: indexStore, api: indexStoreAPI)
44+
let testInfo = try store.listTests(in: objects)
45+
tests.append(contentsOf: testInfo)
5246
}
5347

5448
try executionDelegate.fs.write(options.output, contents: ByteString(encodingAsUTF8: """
@@ -58,7 +52,7 @@ class TestEntryPointGenerationTaskAction: TaskAction {
5852
5953
\(testObservationFragment)
6054
61-
public import XCTest
55+
import XCTest
6256
\(discoveredTestsFragment(tests: tests))
6357
6458
@main
@@ -100,7 +94,16 @@ class TestEntryPointGenerationTaskAction: TaskAction {
10094
}
10195
}
10296
#endif
103-
\(xctestFragment(enableExperimentalTestOutput: options.enableExperimentalTestOutput, disable: !options.discoverTests))
97+
if testingLibrary == "xctest" {
98+
#if !os(Windows) && \(options.enableExperimentalTestOutput)
99+
_ = Self.testOutputPath().map { SwiftPMXCTestObserver(testOutputPath: testOutputPath) }
100+
#endif
101+
#if os(WASI)
102+
await XCTMain(__allDiscoveredTests()) as Never
103+
#else
104+
XCTMain(__allDiscoveredTests()) as Never
105+
#endif
106+
}
104107
}
105108
#else
106109
static func main() async {
@@ -110,7 +113,16 @@ class TestEntryPointGenerationTaskAction: TaskAction {
110113
await Testing.__swiftPMEntryPoint() as Never
111114
}
112115
#endif
113-
\(xctestFragment(enableExperimentalTestOutput: options.enableExperimentalTestOutput, disable: !options.discoverTests))
116+
if testingLibrary == "xctest" {
117+
#if !os(Windows) && \(options.enableExperimentalTestOutput)
118+
_ = Self.testOutputPath().map { SwiftPMXCTestObserver(testOutputPath: testOutputPath) }
119+
#endif
120+
#if os(WASI)
121+
await XCTMain(__allDiscoveredTests()) as Never
122+
#else
123+
XCTMain(__allDiscoveredTests()) as Never
124+
#endif
125+
}
114126
}
115127
#endif
116128
}
@@ -125,18 +137,14 @@ class TestEntryPointGenerationTaskAction: TaskAction {
125137

126138
private struct Options: ParsableArguments {
127139
@Option var output: Path
128-
@Option var indexStoreLibraryPath: Path? = nil
129-
@Option() var linkerFilelist: [Path] = []
130-
@Option var indexStore: [Path] = []
131-
@Option var indexUnitBasePath: [Path] = []
140+
@Option var indexStoreLibraryPath: Path
141+
@Option var linkerFilelist: [Path]
142+
@Option var indexStore: [Path]
143+
@Option var indexUnitBasePath: [Path]
132144
@Flag var enableExperimentalTestOutput: Bool = false
133-
@Flag var discoverTests: Bool = false
134145
}
135146

136147
private func discoveredTestsFragment(tests: [IndexStore.TestCaseClass]) -> String {
137-
guard !tests.isEmpty else {
138-
return ""
139-
}
140148
var fragment = ""
141149
for moduleName in Set(tests.map { $0.module }).sorted() {
142150
fragment += "@testable import \(moduleName)\n"
@@ -166,29 +174,11 @@ class TestEntryPointGenerationTaskAction: TaskAction {
166174
return fragment
167175
}
168176

169-
private func xctestFragment(enableExperimentalTestOutput: Bool, disable: Bool) -> String {
170-
guard !disable else {
171-
return ""
172-
}
173-
return """
174-
if testingLibrary == "xctest" {
175-
#if !os(Windows) && \(enableExperimentalTestOutput)
176-
_ = Self.testOutputPath().map { SwiftPMXCTestObserver(testOutputPath: testOutputPath) }
177-
#endif
178-
#if os(WASI)
179-
await XCTMain(__allDiscoveredTests()) as Never
180-
#else
181-
XCTMain(__allDiscoveredTests()) as Never
182-
#endif
183-
}
184-
"""
185-
}
186-
187177
private var testObservationFragment: String =
188178
"""
189179
#if !os(Windows) // Test observation is not supported on Windows
190-
public import Foundation
191-
public import XCTest
180+
import Foundation
181+
import XCTest
192182
193183
public final class SwiftPMXCTestObserver: NSObject {
194184
let testOutputPath: String
@@ -572,7 +562,7 @@ class TestEntryPointGenerationTaskAction: TaskAction {
572562
}
573563
}
574564
575-
public import XCTest
565+
import XCTest
576566
577567
#if canImport(Darwin) // XCTAttachment is unavailable in swift-corelibs-xctest.
578568
extension TestAttachment {

Sources/SWBUniversalPlatform/TestEntryPointGenerationTool.swift

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,9 @@ final class TestEntryPointGenerationToolSpec: GenericCommandLineToolSpec, SpecId
1919

2020
override func commandLineFromTemplate(_ cbc: CommandBuildContext, _ delegate: any TaskGenerationDelegate, optionContext: (any DiscoveredCommandLineToolSpecInfo)?, specialArgs: [String] = [], lookup: ((MacroDeclaration) -> MacroExpression?)? = nil) async -> [CommandLineArgument] {
2121
var args = await super.commandLineFromTemplate(cbc, delegate, optionContext: optionContext, specialArgs: specialArgs, lookup: lookup)
22-
if cbc.scope.evaluate(BuiltinMacros.GENERATED_TEST_ENTRY_POINT_INCLUDE_DISCOVERED_TESTS) {
23-
args.append("--discover-tests")
24-
for toolchainLibrarySearchPath in cbc.producer.toolchains.map({ $0.librarySearchPaths }) {
25-
if let path = toolchainLibrarySearchPath.findLibrary(operatingSystem: cbc.producer.hostOperatingSystem, basename: "IndexStore") {
26-
args.append(contentsOf: ["--index-store-library-path", .path(path)])
27-
break
28-
}
22+
for (toolchainPath, toolchainLibrarySearchPath) in cbc.producer.toolchains.map({ ($0.path, $0.librarySearchPaths) }) {
23+
if let path = toolchainLibrarySearchPath.findLibrary(operatingSystem: cbc.producer.hostOperatingSystem, basename: "IndexStore") {
24+
args.append(contentsOf: ["--index-store-library-path", .path(path)])
2925
}
3026
for input in cbc.inputs {
3127
if input.fileType.conformsTo(identifier: "text") {
@@ -47,14 +43,12 @@ final class TestEntryPointGenerationToolSpec: GenericCommandLineToolSpec, SpecId
4743
public func constructTasks(_ cbc: CommandBuildContext, _ delegate: any TaskGenerationDelegate, indexStorePaths: [Path], indexUnitBasePaths: [Path]) async {
4844
var commandLine = await commandLineFromTemplate(cbc, delegate, optionContext: nil)
4945

50-
if cbc.scope.evaluate(BuiltinMacros.GENERATED_TEST_ENTRY_POINT_INCLUDE_DISCOVERED_TESTS) {
51-
for indexStorePath in indexStorePaths {
52-
commandLine.append(contentsOf: ["--index-store", .path(indexStorePath)])
53-
}
54-
55-
for basePath in indexUnitBasePaths {
56-
commandLine.append(contentsOf: ["--index-unit-base-path", .path(basePath)])
57-
}
46+
for indexStorePath in indexStorePaths {
47+
commandLine.append(contentsOf: ["--index-store", .path(indexStorePath)])
48+
}
49+
50+
for basePath in indexUnitBasePaths {
51+
commandLine.append(contentsOf: ["--index-unit-base-path", .path(basePath)])
5852
}
5953

6054
delegate.createTask(

Tests/SWBBuildSystemTests/BuildOperationTests.swift

Lines changed: 0 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -382,76 +382,6 @@ fileprivate struct BuildOperationTests: CoreBasedTests {
382382
}
383383
}
384384

385-
@Test(.requireSDKs(.macOS))
386-
func unitTestWithGeneratedEntryPointViaMacOSOverride() async throws {
387-
try await withTemporaryDirectory(removeTreeOnDeinit: false) { (tmpDir: Path) in
388-
let testProject = try await TestProject(
389-
"TestProject",
390-
sourceRoot: tmpDir,
391-
groupTree: TestGroup(
392-
"SomeFiles",
393-
children: [
394-
TestFile("test.swift"),
395-
]),
396-
buildConfigurations: [
397-
TestBuildConfiguration("Debug", buildSettings: [
398-
"ARCHS": "$(ARCHS_STANDARD)",
399-
"CODE_SIGNING_ALLOWED": "NO",
400-
"PRODUCT_NAME": "$(TARGET_NAME)",
401-
"SDKROOT": "$(HOST_PLATFORM)",
402-
"SUPPORTED_PLATFORMS": "$(HOST_PLATFORM)",
403-
"SWIFT_VERSION": swiftVersion,
404-
"INDEX_DATA_STORE_DIR": "\(tmpDir.join("index").str)",
405-
"LINKER_DRIVER": "swiftc"
406-
])
407-
],
408-
targets: [
409-
TestStandardTarget(
410-
"MyTests",
411-
type: .unitTest,
412-
buildConfigurations: [
413-
TestBuildConfiguration("Debug", buildSettings: [
414-
"GENERATE_TEST_ENTRYPOINTS_FOR_BUNDLES": "YES"
415-
])
416-
],
417-
buildPhases: [
418-
TestSourcesBuildPhase(["test.swift"]),
419-
],
420-
),
421-
])
422-
let core = try await getCore()
423-
let tester = try await BuildOperationTester(core, testProject, simulated: false)
424-
try localFS.createDirectory(tmpDir.join("index"))
425-
let projectDir = tester.workspace.projects[0].sourceRoot
426-
427-
try await tester.fs.writeFileContents(projectDir.join("test.swift")) { stream in
428-
stream <<< """
429-
import Testing
430-
import XCTest
431-
@Suite struct MySuite {
432-
@Test func myTest() {
433-
#expect(42 == 42)
434-
}
435-
}
436-
437-
final class MYXCTests: XCTestCase {
438-
func testFoo() {
439-
XCTAssertTrue(true)
440-
}
441-
}
442-
"""
443-
}
444-
445-
let destination: RunDestinationInfo = .host
446-
try await tester.checkBuild(runDestination: destination, persistent: true) { results in
447-
results.checkNoErrors()
448-
results.checkTask(.matchRuleType("GenerateTestEntryPoint")) { task in
449-
task.checkCommandLineMatches(["builtin-generateTestEntryPoint", "--output", .suffix("test_entry_point.swift")])
450-
}
451-
}
452-
}
453-
}
454-
455385
@Test(.requireSDKs(.host), .skipHostOS(.macOS), .skipHostOS(.windows, "cannot find testing library"))
456386
func unitTestWithGeneratedEntryPoint() async throws {
457387
try await withTemporaryDirectory(removeTreeOnDeinit: false) { (tmpDir: Path) in

Tests/SWBTaskConstructionTests/UnitTestTaskConstructionTests.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -366,7 +366,7 @@ fileprivate struct UnitTestTaskConstructionTests: CoreBasedTests {
366366
await tester.checkBuild(runDestination: .linux, fs: fs) { results in
367367
results.checkTarget("UnitTestRunner") { target in
368368
results.checkTask(.matchTarget(target), .matchRuleType("GenerateTestEntryPoint")) { task in
369-
task.checkCommandLineMatches([.suffix("builtin-generateTestEntryPoint"), "--output", .suffix("test_entry_point.swift"), "--discover-tests", "--index-store-library-path", .suffix("libIndexStore.so"), "--linker-filelist", .suffix("UnitTestTarget.LinkFileList"), "--index-store", "/index", "--index-unit-base-path", "/tmp/Test/aProject/build"])
369+
task.checkCommandLineMatches([.suffix("builtin-generateTestEntryPoint"), "--output", .suffix("test_entry_point.swift"), "--index-store-library-path", .suffix("libIndexStore.so"), "--linker-filelist", .suffix("UnitTestTarget.LinkFileList"), "--index-store", "/index", "--index-unit-base-path", "/tmp/Test/aProject/build"])
370370
task.checkInputs([
371371
.pathPattern(.suffix("UnitTestTarget.LinkFileList")),
372372
.pathPattern(.suffix("UnitTestTarget.so")),

0 commit comments

Comments
 (0)