Skip to content

[Traits] Enable trait configuration for swift-test #7704

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jun 25, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 50 additions & 0 deletions Fixtures/Traits/Example/Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -99,5 +99,55 @@ let package = Package(
.define("DEFINE3", .when(traits: ["BuildCondition3"])),
]
),
.testTarget(
name: "ExampleTests",
dependencies: [
.product(
name: "Package1Library1",
package: "Package1",
condition: .when(traits: ["Package1"])
),
.product(
name: "Package2Library1",
package: "Package2",
condition: .when(traits: ["Package2"])
),
.product(
name: "Package3Library1",
package: "Package3",
condition: .when(traits: ["Package3"])
),
.product(
name: "Package4Library1",
package: "Package4",
condition: .when(traits: ["Package4"])
),
.product(
name: "Package5Library1",
package: "Package5",
condition: .when(traits: ["Package5"])
),
.product(
name: "Package7Library1",
package: "Package7",
condition: .when(traits: ["Package7"])
),
.product(
name: "Package9Library1",
package: "Package9",
condition: .when(traits: ["Package9"])
),
.product(
name: "Package10Library1",
package: "Package10",
condition: .when(traits: ["Package10"])
),
],
swiftSettings: [
.define("DEFINE1", .when(traits: ["BuildCondition1"])),
.define("DEFINE2", .when(traits: ["BuildCondition2"])),
.define("DEFINE3", .when(traits: ["BuildCondition3"])),
]
)
]
)
70 changes: 70 additions & 0 deletions Fixtures/Traits/Example/Tests/ExampleTests/Tests.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
#if Package1
import Package1Library1
#endif
#if Package2
import Package2Library1
#endif
#if Package3
import Package3Library1
#endif
#if Package4
import Package4Library1
#endif
#if Package5
import Package5Library1
#endif
#if Package7
import Package7Library1
#endif
#if Package9
import Package9Library1
#endif
#if Package10
import Package10Library1
#endif

import XCTest

final class Tests: XCTestCase {
func testTraits() {
#if Package1
Package1Library1.hello()
#endif
#if Package2
Package2Library1.hello()
#endif
#if Package3
Package3Library1.hello()
#endif
#if Package4
Package4Library1.hello()
#endif
#if Package5
Package5Library1.hello()
#endif
#if Package7
Package7Library1.hello()
#endif
#if Package9
Package9Library1.hello()
#endif
#if Package10
Package10Library1.hello()
#endif
#if DEFINE1
print("DEFINE1 enabled")
#else
print("DEFINE1 disabled")
#endif
#if DEFINE2
print("DEFINE2 enabled")
#else
print("DEFINE2 disabled")
#endif
#if DEFINE3
print("DEFINE3 enabled")
#else
print("DEFINE3 disabled")
#endif
}
}
18 changes: 13 additions & 5 deletions Sources/Commands/SwiftTestCommand.swift
Original file line number Diff line number Diff line change
Expand Up @@ -170,6 +170,9 @@ struct TestCommandOptions: ParsableArguments {
@Option(name: .customLong("experimental-event-stream-version"),
help: .hidden)
var eventStreamVersion: Int?

@OptionGroup(visibility: .hidden)
package var traits: TraitOptions
}

/// Tests filtering specifier, which is used to filter tests to run.
Expand Down Expand Up @@ -570,7 +573,8 @@ public struct SwiftTestCommand: AsyncSwiftCommand {
swiftCommandState: swiftCommandState,
productsBuildParameters: productsBuildParameters,
toolsBuildParameters: toolsBuildParameters,
testProduct: self.options.sharedOptions.testProduct
testProduct: self.options.sharedOptions.testProduct,
traitConfiguration: .init(traitOptions: self.options.traits)
)
}

Expand Down Expand Up @@ -652,6 +656,9 @@ extension SwiftTestCommand {
@OptionGroup()
var testLibraryOptions: TestLibraryOptions

@OptionGroup(visibility: .hidden)
package var traits: TraitOptions

// for deprecated passthrough from SwiftTestTool (parse will fail otherwise)
@Flag(name: [.customLong("list-tests"), .customShort("l")], help: .hidden)
var _deprecated_passthrough: Bool = false
Expand Down Expand Up @@ -748,7 +755,8 @@ extension SwiftTestCommand {
swiftCommandState: swiftCommandState,
productsBuildParameters: productsBuildParameters,
toolsBuildParameters: toolsBuildParameters,
testProduct: self.sharedOptions.testProduct
testProduct: self.sharedOptions.testProduct,
traitConfiguration: .init(traitOptions: self.traits)
)
}
}
Expand Down Expand Up @@ -1373,11 +1381,11 @@ private func buildTestsIfNeeded(
swiftCommandState: SwiftCommandState,
productsBuildParameters: BuildParameters,
toolsBuildParameters: BuildParameters,
testProduct: String?
testProduct: String?,
traitConfiguration: TraitConfiguration
) throws -> [BuiltTestProduct] {
let buildSystem = try swiftCommandState.createBuildSystem(
// TODO: Will support traits in test in a follow up PR
traitConfiguration: .init(),
traitConfiguration: traitConfiguration,
productsBuildParameters: productsBuildParameters,
toolsBuildParameters: toolsBuildParameters
)
Expand Down
40 changes: 40 additions & 0 deletions Tests/FunctionalTests/TraitTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -174,5 +174,45 @@ final class TraitTests: XCTestCase {
}
}

func testTests_whenNoFlagPassed() async throws {
try await fixture(name: "Traits") { fixturePath in
let (stdout, _) = try await executeSwiftTest(fixturePath.appending("Example"))
let expectedOut = """
Package1Library1 trait1 enabled
Package2Library1 trait2 enabled
Package3Library1 trait3 enabled
Package4Library1 trait1 disabled
DEFINE1 enabled
DEFINE2 disabled
DEFINE3 disabled

"""
XCTAssertTrue(stdout.contains(expectedOut))
}
}

func testTests_whenAllTraitsEnabled_andDefaultTraitsDisabled() async throws {
try await fixture(name: "Traits") { fixturePath in
let (stdout, _) = try await executeSwiftTest(fixturePath.appending("Example"), extraArgs: ["--experimental-enable-all-traits", "--experimental-disable-default-traits"])
let expectedOut = """
Package1Library1 trait1 enabled
Package2Library1 trait2 enabled
Package3Library1 trait3 enabled
Package4Library1 trait1 disabled
Package5Library1 trait1 enabled
Package6Library1 trait1 enabled
Package7Library1 trait1 disabled
Package10Library1 trait1 enabled
Package10Library1 trait2 enabled
Package10Library1 trait1 enabled
Package10Library1 trait2 enabled
DEFINE1 enabled
DEFINE2 enabled
DEFINE3 enabled

"""
XCTAssertTrue(stdout.contains(expectedOut))
}
}
}
#endif