Skip to content

Commit c965d5a

Browse files
authored
Set an environment variable in swift test to indicate which testing library is in use. (#7573)
This PR sets a new environment variable `"SWIFT_PM_TEST_LIBRARY"` to the name of the active testing library (`"XCTest"` or `"swift-testing"`.) Code in these libraries can then use the presence of this environment variable to adjust their behaviour. Resolves rdar://128272138.
1 parent e5123e4 commit c965d5a

File tree

6 files changed

+42
-7
lines changed

6 files changed

+42
-7
lines changed
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
// swift-tools-version: 5.10
2+
3+
import PackageDescription
4+
5+
let package = Package(
6+
name: "CheckTestLibraryEnvironmentVariable",
7+
targets: [
8+
.testTarget(name: "CheckTestLibraryEnvironmentVariableTests"),
9+
]
10+
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import XCTest
2+
3+
final class CheckTestLibraryEnvironmentVariableTests: XCTestCase {
4+
func testEnviromentVariable() throws {
5+
let envvar = ProcessInfo.processInfo.environment["SWIFT_PM_TEST_LIBRARY"]
6+
XCTAssertEqual(envvar, "XCTest")
7+
}
8+
}

Sources/Commands/SwiftTestCommand.swift

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -421,7 +421,8 @@ public struct SwiftTestCommand: AsyncSwiftCommand {
421421
let testEnv = try TestingSupport.constructTestEnvironment(
422422
toolchain: toolchain,
423423
destinationBuildParameters: productsBuildParameters,
424-
sanitizers: globalOptions.build.sanitizers
424+
sanitizers: globalOptions.build.sanitizers,
425+
library: library
425426
)
426427

427428
let runner = TestRunner(
@@ -702,7 +703,8 @@ extension SwiftTestCommand {
702703
let testEnv = try TestingSupport.constructTestEnvironment(
703704
toolchain: toolchain,
704705
destinationBuildParameters: productsBuildParameters,
705-
sanitizers: globalOptions.build.sanitizers
706+
sanitizers: globalOptions.build.sanitizers,
707+
library: .swiftTesting
706708
)
707709

708710
let additionalArguments = ["--list-tests"] + CommandLine.arguments.dropFirst()
@@ -1014,7 +1016,8 @@ final class ParallelTestRunner {
10141016
let testEnv = try TestingSupport.constructTestEnvironment(
10151017
toolchain: self.toolchain,
10161018
destinationBuildParameters: self.productsBuildParameters,
1017-
sanitizers: self.buildOptions.sanitizers
1019+
sanitizers: self.buildOptions.sanitizers,
1020+
library: .xctest // swift-testing does not use ParallelTestRunner
10181021
)
10191022

10201023
// Enqueue all the tests.

Sources/Commands/Utilities/PluginDelegate.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,8 @@ final class PluginDelegate: PluginInvocationDelegate {
236236
let testEnvironment = try TestingSupport.constructTestEnvironment(
237237
toolchain: toolchain,
238238
destinationBuildParameters: toolsBuildParameters,
239-
sanitizers: swiftCommandState.options.build.sanitizers
239+
sanitizers: swiftCommandState.options.build.sanitizers,
240+
library: .xctest // FIXME: support both libraries
240241
)
241242

242243
// Iterate over the tests and run those that match the filter.

Sources/Commands/Utilities/TestingSupport.swift

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,8 @@ enum TestingSupport {
121121
experimentalTestOutput: experimentalTestOutput,
122122
library: .xctest
123123
).productsBuildParameters,
124-
sanitizers: sanitizers
124+
sanitizers: sanitizers,
125+
library: .xctest
125126
)
126127

127128
try TSCBasic.Process.checkNonZeroExit(arguments: args, environment: env)
@@ -136,7 +137,8 @@ enum TestingSupport {
136137
shouldSkipBuilding: shouldSkipBuilding,
137138
library: .xctest
138139
).productsBuildParameters,
139-
sanitizers: sanitizers
140+
sanitizers: sanitizers,
141+
library: .xctest
140142
)
141143
args = [path.description, "--dump-tests-json"]
142144
let data = try Process.checkNonZeroExit(arguments: args, environment: env)
@@ -149,7 +151,8 @@ enum TestingSupport {
149151
static func constructTestEnvironment(
150152
toolchain: UserToolchain,
151153
destinationBuildParameters buildParameters: BuildParameters,
152-
sanitizers: [Sanitizer]
154+
sanitizers: [Sanitizer],
155+
library: BuildParameters.Testing.Library
153156
) throws -> EnvironmentVariables {
154157
var env = EnvironmentVariables.process()
155158

@@ -161,6 +164,10 @@ enum TestingSupport {
161164
env["NO_COLOR"] = "1"
162165
}
163166

167+
// Set an environment variable to indicate which library's test product
168+
// is being executed.
169+
env["SWIFT_PM_TEST_LIBRARY"] = String(describing: library)
170+
164171
// Add the code coverage related variables.
165172
if buildParameters.testingParameters.enableCodeCoverage {
166173
// Defines the path at which the profraw files will be written on test execution.

Tests/CommandsTests/TestCommandTests.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -303,4 +303,10 @@ final class TestCommandTests: CommandsTestCase {
303303
}
304304
}
305305
#endif
306+
307+
func testLibraryEnvironmentVariable() throws {
308+
try fixture(name: "Miscellaneous/CheckTestLibraryEnvironmentVariable") { fixturePath in
309+
XCTAssertNoThrow(try SwiftPM.Test.execute(packagePath: fixturePath))
310+
}
311+
}
306312
}

0 commit comments

Comments
 (0)