Skip to content

Remove discovery target in swift-testing case #7123

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
Dec 4, 2023
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
4 changes: 3 additions & 1 deletion Sources/Build/BuildManifest/LLBuildManifestBuilder.swift
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,9 @@ public class LLBuildManifestBuilder {
}
}

try self.addTestDiscoveryGenerationCommand()
if self.buildParameters.testingParameters.library == .xctest {
try self.addTestDiscoveryGenerationCommand()
}
try self.addTestEntryPointGenerationCommand()

// Create command for all products in the plan.
Expand Down
47 changes: 34 additions & 13 deletions Sources/Build/BuildPlan/BuildPlan+Test.swift
Original file line number Diff line number Diff line change
Expand Up @@ -104,21 +104,24 @@ extension BuildPlan {

/// Generates a synthesized test entry point target, consisting of a single "main" file which calls the test entry
/// point API and leverages the test discovery target to reference which tests to run.
func generateSynthesizedEntryPointTarget(discoveryTarget: SwiftTarget, discoveryResolvedTarget: ResolvedTarget) throws -> SwiftTargetBuildDescription {
func generateSynthesizedEntryPointTarget(
swiftTargetDependencies: [Target.Dependency],
resolvedTargetDependencies: [ResolvedTarget.Dependency]
) throws -> SwiftTargetBuildDescription {
let entryPointDerivedDir = buildParameters.buildPath.appending(components: "\(testProduct.name).derived")
let entryPointMainFile = entryPointDerivedDir.appending(component: TestEntryPointTool.mainFileName)
let entryPointSources = Sources(paths: [entryPointMainFile], root: entryPointDerivedDir)

let entryPointTarget = SwiftTarget(
name: testProduct.name,
type: .library,
dependencies: testProduct.underlyingProduct.targets.map { .target($0, conditions: []) } + [.target(discoveryTarget, conditions: [])],
dependencies: testProduct.underlyingProduct.targets.map { .target($0, conditions: []) } + swiftTargetDependencies,
packageAccess: true, // test target is allowed access to package decls
testEntryPointSources: entryPointSources
)
let entryPointResolvedTarget = ResolvedTarget(
target: entryPointTarget,
dependencies: testProduct.targets.map { .target($0, conditions: []) } + [.target(discoveryResolvedTarget, conditions: [])],
dependencies: testProduct.targets.map { .target($0, conditions: []) } + resolvedTargetDependencies,
defaultLocalization: testProduct.defaultLocalization,
platforms: testProduct.platforms
)
Expand All @@ -133,21 +136,34 @@ extension BuildPlan {
)
}

let discoveryTargets: (target: SwiftTarget, resolved: ResolvedTarget, buildDescription: SwiftTargetBuildDescription)?
let swiftTargetDependencies: [Target.Dependency]
let resolvedTargetDependencies: [ResolvedTarget.Dependency]

switch buildParameters.testingParameters.library {
case .xctest:
discoveryTargets = try generateDiscoveryTargets()
swiftTargetDependencies = [.target(discoveryTargets!.target, conditions: [])]
resolvedTargetDependencies = [.target(discoveryTargets!.resolved, conditions: [])]
case .swiftTesting:
discoveryTargets = nil
swiftTargetDependencies = testProduct.targets.map { .target($0.underlyingTarget, conditions: []) }
resolvedTargetDependencies = testProduct.targets.map { .target($0, conditions: []) }
}

if let entryPointResolvedTarget = testProduct.testEntryPointTarget {
if isEntryPointPathSpecifiedExplicitly || explicitlyEnabledDiscovery {
let discoveryTargets = try generateDiscoveryTargets()

if isEntryPointPathSpecifiedExplicitly {
// Allow using the explicitly-specified test entry point target, but still perform test discovery and thus declare a dependency on the discovery targets.
let entryPointTarget = SwiftTarget(
name: entryPointResolvedTarget.underlyingTarget.name,
dependencies: entryPointResolvedTarget.underlyingTarget.dependencies + [.target(discoveryTargets.target, conditions: [])],
dependencies: entryPointResolvedTarget.underlyingTarget.dependencies + swiftTargetDependencies,
packageAccess: entryPointResolvedTarget.packageAccess,
testEntryPointSources: entryPointResolvedTarget.underlyingTarget.sources
)
let entryPointResolvedTarget = ResolvedTarget(
target: entryPointTarget,
dependencies: entryPointResolvedTarget.dependencies + [.target(discoveryTargets.resolved, conditions: [])],
dependencies: entryPointResolvedTarget.dependencies + resolvedTargetDependencies,
defaultLocalization: testProduct.defaultLocalization,
platforms: testProduct.platforms
)
Expand All @@ -161,11 +177,14 @@ extension BuildPlan {
observabilityScope: observabilityScope
)

result.append((testProduct, discoveryTargets.buildDescription, entryPointTargetBuildDescription))
result.append((testProduct, discoveryTargets?.buildDescription, entryPointTargetBuildDescription))
} else {
// Ignore test entry point and synthesize one, declaring a dependency on the test discovery targets created above.
let entryPointTargetBuildDescription = try generateSynthesizedEntryPointTarget(discoveryTarget: discoveryTargets.target, discoveryResolvedTarget: discoveryTargets.resolved)
result.append((testProduct, discoveryTargets.buildDescription, entryPointTargetBuildDescription))
let entryPointTargetBuildDescription = try generateSynthesizedEntryPointTarget(
swiftTargetDependencies: swiftTargetDependencies,
resolvedTargetDependencies: resolvedTargetDependencies
)
result.append((testProduct, discoveryTargets?.buildDescription, entryPointTargetBuildDescription))
}
} else {
// Use the test entry point as-is, without performing test discovery.
Expand All @@ -182,9 +201,11 @@ extension BuildPlan {
}
} else {
// Synthesize a test entry point target, declaring a dependency on the test discovery targets.
let discoveryTargets = try generateDiscoveryTargets()
let entryPointTargetBuildDescription = try generateSynthesizedEntryPointTarget(discoveryTarget: discoveryTargets.target, discoveryResolvedTarget: discoveryTargets.resolved)
result.append((testProduct, discoveryTargets.buildDescription, entryPointTargetBuildDescription))
let entryPointTargetBuildDescription = try generateSynthesizedEntryPointTarget(
swiftTargetDependencies: swiftTargetDependencies,
resolvedTargetDependencies: resolvedTargetDependencies
)
result.append((testProduct, discoveryTargets?.buildDescription, entryPointTargetBuildDescription))
}
}

Expand Down