Skip to content

Reduce Repository Cache Test #3047

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
Nov 13, 2020
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
19 changes: 0 additions & 19 deletions Fixtures/DependencyResolution/Regressions/SRP/Package.swift

This file was deleted.

1 change: 0 additions & 1 deletion Fixtures/DependencyResolution/Regressions/SRP/README.md

This file was deleted.

Empty file.
15 changes: 0 additions & 15 deletions Tests/FunctionalTests/DependencyResolutionTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -65,19 +65,4 @@ class DependencyResolutionTests: XCTestCase {
XCTAssertEqual(output, "♣︎K\n♣︎Q\n♣︎J\n♣︎10\n♣︎9\n♣︎8\n♣︎7\n♣︎6\n♣︎5\n♣︎4\n")
}
}

func testRepositoryCacheDoesNotDerailResolution() throws {
// From rdar://problem/65284674
// RepositoryPackageContainer used to erroneously cache dependencies based only on version,
// storing the result of the first product filter and then continually returning it for other filters too.
// This lead to corrupt graph states.
guard Resources.havePD4Runtime else {
throw XCTSkip("PackageDescription v4 is unavailable; this test requires the compiler script instead of a self‐hosted build.")
}

fixture(name: "DependencyResolution/Regressions/SRP") { prefix in
let (output, error) = try executeSwiftPackage(prefix, extraArgs: ["resolve"])
XCTAssert(error.isEmpty, output + error)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -567,4 +567,78 @@ class RepositoryPackageContainerProviderTests: XCTestCase {
}
}
}

func testRepositoryPackageContainerCache() throws {
// From rdar://problem/65284674
// RepositoryPackageContainer used to erroneously cache dependencies based only on version,
// storing the result of the first product filter and then continually returning it for other filters too.
// This lead to corrupt graph states.

try testWithTemporaryDirectory { temporaryDirectory in
let packageDirectory = temporaryDirectory.appending(component: "Package")
try localFileSystem.createDirectory(packageDirectory)
initGitRepo(packageDirectory)
let packageRepository = GitRepository(path: packageDirectory)

let manifestFile = packageDirectory.appending(component: "Package.swift")
try localFileSystem.writeFileContents(manifestFile, bytes: ByteString("// swift-tools-version:5.2"))

try packageRepository.stage(file: "Package.swift")
try packageRepository.commit(message: "Initialized.")
try packageRepository.tag(name: "1.0.0")

let repositoryProvider = GitRepositoryProvider()
let repositoryManager = RepositoryManager(
path: packageDirectory,
provider: repositoryProvider,
delegate: nil,
fileSystem: localFileSystem
)

let version = Version(1, 0, 0)
let manifest = Manifest.createManifest(
name: packageDirectory.basename,
path: packageDirectory.pathString,
url: packageDirectory.pathString,
v: .v5_2,
packageKind: .root,
dependencies: [
PackageDependencyDescription(
url: "Somewhere/Dependency",
requirement: .exact(version),
productFilter: .specific([])
)
],
products: [ProductDescription(name: "Product", type: .library(.automatic), targets: ["Target"])],
targets: [
TargetDescription(
name: "Target",
dependencies: [.product(name: "DependencyProduct", package: "Dependency")]
),
]
)
let containerProvider = RepositoryPackageContainerProvider(
repositoryManager: repositoryManager,
manifestLoader: MockManifestLoader(
manifests: [.init(url: packageDirectory.pathString, version: Version(1, 0, 0)): manifest]
)
)

let packageReference = PackageReference(identity: "package", path: packageDirectory.pathString)
let container = try tsc_await { completion in
containerProvider.getContainer(
for: packageReference,
skipUpdate: false,
completion: completion
)
}

let forNothing = try container.getDependencies(at: version, productFilter: .specific([]))
let forProduct = try container.getDependencies(at: version, productFilter: .specific(["Product"]))
#if ENABLE_TARGET_BASED_DEPENDENCY_RESOLUTION
// If the cache overlaps (incorrectly), these will be the same.
XCTAssertNotEqual(forNothing, forProduct)
#endif
}
}
}