Skip to content

Commit 59b6648

Browse files
authored
[Traits] Enable trait configuration for swift-test (#7704)
# Motivation It is useful to be able to configure the traits of the root package when running tests. # Modification This PR adds the trait CLI options to the `swift test` command to enable specific traits or all traits, or to disable the default traits. # Result `swift test` now supports configuring the root traits.
1 parent 39c384a commit 59b6648

File tree

4 files changed

+173
-5
lines changed

4 files changed

+173
-5
lines changed

Fixtures/Traits/Example/Package.swift

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,5 +99,55 @@ let package = Package(
9999
.define("DEFINE3", .when(traits: ["BuildCondition3"])),
100100
]
101101
),
102+
.testTarget(
103+
name: "ExampleTests",
104+
dependencies: [
105+
.product(
106+
name: "Package1Library1",
107+
package: "Package1",
108+
condition: .when(traits: ["Package1"])
109+
),
110+
.product(
111+
name: "Package2Library1",
112+
package: "Package2",
113+
condition: .when(traits: ["Package2"])
114+
),
115+
.product(
116+
name: "Package3Library1",
117+
package: "Package3",
118+
condition: .when(traits: ["Package3"])
119+
),
120+
.product(
121+
name: "Package4Library1",
122+
package: "Package4",
123+
condition: .when(traits: ["Package4"])
124+
),
125+
.product(
126+
name: "Package5Library1",
127+
package: "Package5",
128+
condition: .when(traits: ["Package5"])
129+
),
130+
.product(
131+
name: "Package7Library1",
132+
package: "Package7",
133+
condition: .when(traits: ["Package7"])
134+
),
135+
.product(
136+
name: "Package9Library1",
137+
package: "Package9",
138+
condition: .when(traits: ["Package9"])
139+
),
140+
.product(
141+
name: "Package10Library1",
142+
package: "Package10",
143+
condition: .when(traits: ["Package10"])
144+
),
145+
],
146+
swiftSettings: [
147+
.define("DEFINE1", .when(traits: ["BuildCondition1"])),
148+
.define("DEFINE2", .when(traits: ["BuildCondition2"])),
149+
.define("DEFINE3", .when(traits: ["BuildCondition3"])),
150+
]
151+
)
102152
]
103153
)
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
#if Package1
2+
import Package1Library1
3+
#endif
4+
#if Package2
5+
import Package2Library1
6+
#endif
7+
#if Package3
8+
import Package3Library1
9+
#endif
10+
#if Package4
11+
import Package4Library1
12+
#endif
13+
#if Package5
14+
import Package5Library1
15+
#endif
16+
#if Package7
17+
import Package7Library1
18+
#endif
19+
#if Package9
20+
import Package9Library1
21+
#endif
22+
#if Package10
23+
import Package10Library1
24+
#endif
25+
26+
import XCTest
27+
28+
final class Tests: XCTestCase {
29+
func testTraits() {
30+
#if Package1
31+
Package1Library1.hello()
32+
#endif
33+
#if Package2
34+
Package2Library1.hello()
35+
#endif
36+
#if Package3
37+
Package3Library1.hello()
38+
#endif
39+
#if Package4
40+
Package4Library1.hello()
41+
#endif
42+
#if Package5
43+
Package5Library1.hello()
44+
#endif
45+
#if Package7
46+
Package7Library1.hello()
47+
#endif
48+
#if Package9
49+
Package9Library1.hello()
50+
#endif
51+
#if Package10
52+
Package10Library1.hello()
53+
#endif
54+
#if DEFINE1
55+
print("DEFINE1 enabled")
56+
#else
57+
print("DEFINE1 disabled")
58+
#endif
59+
#if DEFINE2
60+
print("DEFINE2 enabled")
61+
#else
62+
print("DEFINE2 disabled")
63+
#endif
64+
#if DEFINE3
65+
print("DEFINE3 enabled")
66+
#else
67+
print("DEFINE3 disabled")
68+
#endif
69+
}
70+
}

Sources/Commands/SwiftTestCommand.swift

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,9 @@ struct TestCommandOptions: ParsableArguments {
170170
@Option(name: .customLong("experimental-event-stream-version"),
171171
help: .hidden)
172172
var eventStreamVersion: Int?
173+
174+
@OptionGroup(visibility: .hidden)
175+
package var traits: TraitOptions
173176
}
174177

175178
/// Tests filtering specifier, which is used to filter tests to run.
@@ -570,7 +573,8 @@ public struct SwiftTestCommand: AsyncSwiftCommand {
570573
swiftCommandState: swiftCommandState,
571574
productsBuildParameters: productsBuildParameters,
572575
toolsBuildParameters: toolsBuildParameters,
573-
testProduct: self.options.sharedOptions.testProduct
576+
testProduct: self.options.sharedOptions.testProduct,
577+
traitConfiguration: .init(traitOptions: self.options.traits)
574578
)
575579
}
576580

@@ -652,6 +656,9 @@ extension SwiftTestCommand {
652656
@OptionGroup()
653657
var testLibraryOptions: TestLibraryOptions
654658

659+
@OptionGroup(visibility: .hidden)
660+
package var traits: TraitOptions
661+
655662
// for deprecated passthrough from SwiftTestTool (parse will fail otherwise)
656663
@Flag(name: [.customLong("list-tests"), .customShort("l")], help: .hidden)
657664
var _deprecated_passthrough: Bool = false
@@ -748,7 +755,8 @@ extension SwiftTestCommand {
748755
swiftCommandState: swiftCommandState,
749756
productsBuildParameters: productsBuildParameters,
750757
toolsBuildParameters: toolsBuildParameters,
751-
testProduct: self.sharedOptions.testProduct
758+
testProduct: self.sharedOptions.testProduct,
759+
traitConfiguration: .init(traitOptions: self.traits)
752760
)
753761
}
754762
}
@@ -1373,11 +1381,11 @@ private func buildTestsIfNeeded(
13731381
swiftCommandState: SwiftCommandState,
13741382
productsBuildParameters: BuildParameters,
13751383
toolsBuildParameters: BuildParameters,
1376-
testProduct: String?
1384+
testProduct: String?,
1385+
traitConfiguration: TraitConfiguration
13771386
) throws -> [BuiltTestProduct] {
13781387
let buildSystem = try swiftCommandState.createBuildSystem(
1379-
// TODO: Will support traits in test in a follow up PR
1380-
traitConfiguration: .init(),
1388+
traitConfiguration: traitConfiguration,
13811389
productsBuildParameters: productsBuildParameters,
13821390
toolsBuildParameters: toolsBuildParameters
13831391
)

Tests/FunctionalTests/TraitTests.swift

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,5 +190,45 @@ final class TraitTests: XCTestCase {
190190
}
191191
}
192192

193+
func testTests_whenNoFlagPassed() async throws {
194+
try await fixture(name: "Traits") { fixturePath in
195+
let (stdout, _) = try await executeSwiftTest(fixturePath.appending("Example"))
196+
let expectedOut = """
197+
Package1Library1 trait1 enabled
198+
Package2Library1 trait2 enabled
199+
Package3Library1 trait3 enabled
200+
Package4Library1 trait1 disabled
201+
DEFINE1 enabled
202+
DEFINE2 disabled
203+
DEFINE3 disabled
204+
205+
"""
206+
XCTAssertTrue(stdout.contains(expectedOut))
207+
}
208+
}
209+
210+
func testTests_whenAllTraitsEnabled_andDefaultTraitsDisabled() async throws {
211+
try await fixture(name: "Traits") { fixturePath in
212+
let (stdout, _) = try await executeSwiftTest(fixturePath.appending("Example"), extraArgs: ["--experimental-enable-all-traits", "--experimental-disable-default-traits"])
213+
let expectedOut = """
214+
Package1Library1 trait1 enabled
215+
Package2Library1 trait2 enabled
216+
Package3Library1 trait3 enabled
217+
Package4Library1 trait1 disabled
218+
Package5Library1 trait1 enabled
219+
Package6Library1 trait1 enabled
220+
Package7Library1 trait1 disabled
221+
Package10Library1 trait1 enabled
222+
Package10Library1 trait2 enabled
223+
Package10Library1 trait1 enabled
224+
Package10Library1 trait2 enabled
225+
DEFINE1 enabled
226+
DEFINE2 enabled
227+
DEFINE3 enabled
228+
229+
"""
230+
XCTAssertTrue(stdout.contains(expectedOut))
231+
}
232+
}
193233
}
194234
#endif

0 commit comments

Comments
 (0)